文档详情

《汇编伪指令》ppt课件

tian****1990
实名认证
店铺
PPT
2.67MB
约36页
文档ID:74868649
《汇编伪指令》ppt课件_第1页
1/36

第5章 汇编语言程序设计,学习重点: ①汇编语言程序的书写规则、语句基本格式及程序的分段结构 ②常用的伪指令语句的格式、功能及应用 ③顺序结构、分支结构、循环结构程序和子程序的基本结构和设计方法 ④ 常用DOS功能调用的方法,包括键盘输入、显示输出和系统时间的功能调用第5章 汇编语言程序设计,,汇编语言的程序与语句,,汇编语言的伪指令,,汇编语言程序设计基础,,中断服务程序设计,,模块化程序设计,5.1 汇编语言的程序与语句,,,5.1.1汇编语言程序的行,,,5.1 汇编语言的程序与语句,,1、段定义的一般方法,定义段是通过“SEGMENT…ENDS“伪操作来实现格式: 段名 SEGMENT 【定义类型】【组合类型】【类型名】 ;指令串或变量定义 段名 ENDS,说明:段名的起名规则与标号的定义规则基本相同,SEGMENT 表示定义段的开始,ENDS表示定义段的结束汇编语言中代码段、数据段、堆栈段和附加段都是用这种方法定义的,仅从结构上无法区别各段因此可将用”SEGMENT.ENDS“定义的段称为逻辑段功能:定义当前段的名字与具体内容,同时规定段在存储器中的定义要求以及与其他段之间的连接关系等。

5.1 汇编语言的程序与语句,硬件系统在读取指令时,自动到代码段中读取,读取数据时自动到数据段那么CPU怎么知道哪个是代码段、哪个是数据段呢?指定段寄存器伪指令可以解决这个问题格式:ASSUME CS: 段名,功能:建立逻辑段与代码段寄存器CS之间的对应关系ASSUME 伪指令一般放在代码段的顶端,汇编系统会根据它的指示自动将代码段的段地址装入CS段寄存器中;而数据段、堆栈段和附加段则无此功能,需用MOV指令将段基址装入相应段寄存器中2、指定段寄存器伪指令,,5.1 汇编语言的程序与语句,,,,,,5.1 汇编语言的程序与语句,,3、汇编语言源程序完整段结构,NAME 模块名 EQU 定义语句 ;通常这部分可以不写 数据段名 SEGMENT ;段名都由咱们自己定义,可允许存在多个段 . 数据段名 ENDS 代码段名 SEGMENT ASSUME CS:CODE,DS:DATA START: CODE ENDS ;结束标志不可缺省 END START,,5.1 汇编语言的程序与语句,,,,,4、简化的段定义方法,,,5 .1 汇编语言的程序与语句,,,,汇编段结构补充,MODEL :内存模式,SMALL:独立代码段,独立数据段,DATA:定义数据段DS;STACK:定义堆栈段SS,CODE:定义代码段CS;EXTRA:定义附加段ES,STARTUP:程序开始;EXIT:返回,,,,5.1 汇编语言的程序与语句,,,,例如:说明用SEGMENT/ENDS ASSUME 来定义段。

DATA SEGMENT ;数据段 XX DB ? DATA ENDS ;数据段结束 EXTRA SEGMENT ;附加段 RSS1 DW? . EXTRA ENDS ;结束 STACK SEGMENT ;堆栈段 DW 50 DUP() . STACK ENDS ;结束,CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA ASSUME ES:EXTRA,SS:STACK START:MOV AX,DATA;装入段基址 MOV DS,AX MOV AX,EXTRA MOV ES,AX CODE ENDS ;结束 END START,A,B,,,,5.1 汇编语言的程序与语句,,1、在一个代码段中,如果没有另外的ASSUME语句重新设置,原来设置的ASSUME语句一直有效2、每条ASSUME语句可设置1-6个段寄存器ASSUME语句来完成段分配时,要注意以下几点:,,3、可用NOTHING删除以前的设置 例如:ASSUME ES:NOTHING 删除ES与某段的联系 ASSUME NOTHING 删除全部6个段寄存器的设置。

4、段寄存器的装入:任何指令执行时都将用到CS、DS、ES、SS寄存器段基址才能形成真正的物理地址在执行这些指令之前,必须先设置这些段寄存器的值,即段基址5.2 汇编语言的伪指令,,1、表达式赋值伪操作EQU 指令格式: 符号名 EQU 表达式,功能:为常数或表达式取一个名字,即把常数的值赋给EQU左边的名字,供以后引用 表达式可以是常数,变量,标号,指令助记符,字符串等5.2.1符号定义伪指令,,例如:CONST EQU 10H SUM EQU CONST+12 ADDR EQU 8003H NAME EQU 'CLASS' . MOV CX,CONST ;引用 MOV DX,ADDR,本例中,两条执行性指令等价于: MOV CX,0010H MOV DX,8003H 等值伪指令相当于C语言中的宏定义“#define“,它主要用于定义外部设备地址对调试程序很有益5.2 汇编语言的伪指令,,,,,5.2.1 符号定义伪指令,,,,5.2 汇编语言的伪指令,,1、变量定义伪指令 指令格式: 【变量名】 数据定义符 操作数项表,功能:定义变量名并为变量分配存储单元,同时将初值赋给相应的存储单元。

5.2.2数据定义伪指令,,,说明: ①变量名的命名规则与标号的命名规则相同其中,变量名是可选项,定义符是必选项,用于说明操作数项的类型属性②操作数项可以是常数、表达式、字符串和?,问号用于预留存储空间,当操作数项为字符串时,必须用单引号括起,且字符是以ASCII码形式存放在存储单元中的5.2 汇编语言的伪指令,,常用的变量定义符如下:,DB:定义字节型变量,每个变量占1个字节的位置 DW:定义字型变量,每个变量占2个字节的位置 DD:定义双字型变量,每个变量占4个字节的位置 DQ:定义四字型变量,每个变量占8个字节的位置 DT:定义十字节型变量,每个变量占10个字节的位置 上述定义符中,前两个使用最多,其他很少使用5.2 汇编语言的伪指令,,,,,例如:X DB 20H Y DW 4344H Z DD 12345678H BUFF DB 1,2,3,4,5 VABB DW ? VARW DB 'abcdxyz123' ARRAY DW 0,0,0,0,0,0 本例中,X、Y、Z相当于高级语言中单个变量的定义,而BUFF、VABB、VARW、ARRAY相当于高级语言中数组的定义即定义一个数据块。

A,B,,使用变量时注意: 一:最好按变量定义的类型使用,尽量避免在不同类型的变量和寄存器之间进行操作 二:变量在指令中的寻找方式为直接寻址,即出现在指令中的变量两个含义:确定的类型、确定的偏移地址5.2 汇编语言的伪指令,,2、重复定义伪指令,上个例题中,ARRAY被赋了6个元素的数组,并且在定义同时还给它赋了初值(6个0),如果数组的长度再大些,按上述方法定义就不太好了,为此,汇编系统专门设置了一条重复定义伪指令DUP.,,指令格式:n DUP (操作数, ……),功能:对操作数项表的内容进行n次重复分配、定义及预置存储单元5.2 汇编语言的伪指令,,重复定义伪指令,例如: BUF1 DW 6 DUP(0) BUF2 DW 10 DUP(?),20 DUP (7) ONE DB 10 DUP (5) TWO DB 2 DUP (10H,'A',—) STRING DB 3 DUP ('TEST 0K') 本例中BUF1预留了6个0,BUF2预留了10个空间,20个7,TWO定义一个简单的二维数组,STRING重复3次“TEST 0K!“,,,,5.2 汇编语言的伪指令,,1、段定义伪指令 指令格式: SEGMENT 和ENDS,功能:指出段名及段的各种属性,并指示段的起始位置和结束位置。

5.2.3 段定义伪指令,,,说明:①上述指令格式中,SEGMENT和ENDS必须成对出现,段名是段的标示符,由用户自行指定用来指示汇编程序为该段分配的存储单元的起始位置,其具有段地址和偏移地址两种属性 ②后面定位类型、组合类型不做要求5.2 汇编语言的伪指令,,,,,,,A,B,,2、段定义说明伪指令 ASSUME 见上节内容 3、组定义伪指令GROUP 格式:组名: GROUP 【段名,段名, 功能:用于将程序中若干个不同名的段集合成一组,使它们都装在一个物理段中,并赋予这个段集合一个组名说明: ①同一段组内的段的数目不受限制,且同一段组内各段的组合类型和类别可以不同,但段组的总字节数不能超过64KB ②当程序在组内不同类型的段间进行时,可共用一个段寄存器,组内各段间的转移视为段内转移5.2 汇编语言的伪指令,,功能:格式1:可直接将表达式的值0-—65535)置入地址计数器,格式2:将语句ORG前程序计数器的现行值 $加上表达式的值后置入地址地址计数器5.2 汇编语言的伪指令,,,,,,,,例如:段定义伪指令示例,DATA SEGMENT ORG 10H ;在数据段10H偏移地址处开始存放20H,30H X DB 20H,30H ORG $+5 ;在数据段17H偏移地址处开始存放‘OK' Y DB 'OK',,,5.2 汇编语言的伪指令,,,,,,,,5.2.4 过程定义伪指令 过程也称子程序,在程序中任何地方都可以调用它。

控制从主程序转移到过程被称为“调用”过程结束后返回主程序 使用过程可以简化源程序,并节省存储空间及程序设计所花的时间,使程序结构简洁清晰、减少编程工作量过程定义伪指令格式:,,,5.2 汇编语言的伪指令,,过程定义伪指令,过程名是过程入口的符号地址,过程也有3种属性:段,偏移量,类型过程属性由过程定义伪指令指定,为NEAR或FARNEAR属性指该过程是一个段内调用,FAR则指段间的调用,如果不指明过程的属性,则汇编程序默认其属性为NEAR汇编语言中,用CALL指令来调用过程,用过程中RET指令结束过程并返回到CALL指令的下一条指令 一个过程可以有多个RET指令,但至少要执行到一个RET指令5.2 汇编语言的伪指令,,过程定义伪指令,过程调用指令格式如下:,,CALL 过程名,,说明:一个段中可以有多个过程,且过程的定义和调用均可以嵌套,一个过程中可以包括多个过程定义,堆栈的大小决定嵌套的深度,但过程不允许交叉另外过程还可以调用过程自身5.2 汇编语言的伪指令,,,,,,,,例如:过程定义伪指令示例 SEGX SEGMENT …. SUBT PROC FAR ; 调用程序过程名SUBT … RET SUBT ENDP …… CALL FAR PTR SUBT ;。

下载提示
相似文档
正为您匹配相似的精品文档