《宏汇编语言程序设计》由会员分享,可在线阅读,更多相关《宏汇编语言程序设计(39页珍藏版)》请在金锄头文库上搜索。
1、第3章 宏汇编语言程序设计3.1 教 学 要 求熟悉汇编语言程序的结构及其语句的结构。熟悉伪指令及其功能。掌握汇编语言结构化程序设计方法,即顺序结构、分支结构和循环结构的设计。熟悉过程(子程序)和宏指令的定义及使用规则。熟悉 DOS 调用功能及其规则。3.2 内 容 提 要3.2.1 汇编语言的语句结构汇编语言程序是由语句组成的。语句的格式如下名称: 操作助记符 操作数,操作数 ;注释汇编语言语句的分成包含名称、操作助记符、操作数、注释四个域。语句格式“ ”中的内容为可选项,根据实际情况而使用。1. 操作助记符域操作助记符域是指令中唯一不可缺少的部分,由指令、伪指令或宏指令构成。(1)指令指令
2、是计算机可以执行的基本操作,汇编时可以转换为机器代码。操作助记符为指令的语句称为指令语句,每条指令语句在执行时都对应一条机器指令。例如MOV、 ADD、SUB 等皆为指令。(2)伪指令伪指令是在汇编语言源程序中使用的指令,用来定义段、定义数据、分配存储器、指示程序结束等。伪指令语句只在汇编语言源程序中使用,不会转换成机器代码,机器不能执行。例如,SEGMENT、DB 、END 等皆是伪指令。(3)宏指令宏指令是由用户自己定义的指令。2. 名称域名称包括标号和变量。名称在汇编语言源程序中定义和使用,名称应以字母开头,后跟若干字母、数字或特殊符号(“_” 、 “.”、 “?”、 “$”、 “”)组
3、成,符号个数不超过 31个。(1)标号标号在代码段中定义和使用,标号后面需要加“:”号,例如“START:” 。标号用来表示代码段中某条语句的地址,因此也称为代码的符号地址。利用标号可以方便实现程序的转移和循环的控制。标号有段属性、偏移属性和类型属性。段属性代表定义标号的段地址;偏移属性代表标号的偏移地址;类型属性代表标号的使用范围,NEAR 类型属性的标号只能在段内使用,而 FAR 类型属性的标号可以在不同段之间使用。(2)变量变量在除代码段以外的其他段(DS,SS,ES)定义,后不跟“:”号。变量用来表示数据的地址,因此也称为数据的符号地址。变量定义格式为变量名 变量属性伪指令 表达式变量
4、属性伪指令包括 DB(定义变量属性为字节) 、DW(定义变量属性为字) 、DD(定义变量属性为双字) 、DQ(定义变量属性为四字) 、DT(定义变量属性为五字) 。表达式包括 一个或多个常量或表达式,中间以“, ”号分隔。例如DAT1 DB 20H,30H,40H; 用单引号括起来的字符或字符串。例如DAT2 DB A,1234;用 DB 伪指令定义字符串时,字符串包含的字符个数不受限制,而用 DW、DD、DQ和 DT 伪指令定义字符串时,字符个数不允许超过 2 个。 一个“?”号,表示数据未定,常用于预留存储空间。例如DAT3 DW ?; 重复方式。重复方式的格式为重复次数 DUP (表达式
5、) ;例如,用 DAT4 变量名预留 256 个字空间的定义语句为DAT4 DW 256 DUP(?) 。变量定义的目的是确定变量的属性和安排数据的存储单元。变量的属性包括段属性SEG(定义变量的段地址) 、偏移属性 OFFSET(定义变量的偏移地址) 、类型属性TYPE(表示一个变量数据所占的字节数) 、长度属性 LENGTH(表示定义变量的重复次数,在 DUP 重复方式下同一变量名的长度属性为重复次数,非重复方式定义的变量长度均为1) 、大小属性 SIZE(SIZE=TYPELENGTH) 。变量的类型属性包括字节类型 BYTE(占 1 字节) 、字类型 WORD(占 2 字节) 、双字类
6、型 DWORD(占 4 字节) 、四字类型(占 8 字节)和 五字类型 (占 10 字节) 。例如:DAT1 DW 10 DUP(10H),TYPE DAT1 的值为 2。3. 操作数域操作数是参与操作的数据或数据所在的地址。操作数包括常数、变量和表达式。(1)常数常数有数值常数和用单引号括起来的字符常数。数值常数可用二进制数(后缀加 B) 、十进制数(后缀加 D 或不加后缀) 、十六进制数(后缀加 H)和八进制数(后缀加 Q) 。例如MOV AL,A;MOV AL,20H;MOV AL,10001001B;都是用常数作为操作数的程序语句。(2)变量变量必须在定义后才能使用。由于变量是符号地址
7、,因此变量代表的操作数表示数据所在的地址。例如,在程序语句“MOV AL,DAT1”中,是用变量 DAT1 来表示操作数的。(3)表达式表达式是用运算操作符将常量、变量连接起来的式子。 算术运算操作符。算术运算操作符有 +(加) 、(减) 、(乘) 、(除) 、MOD(求余) 、SHL(左移) 、SHR (右移) 。 逻辑操作符。逻辑操作符有 AND(与) 、OR(或) 、 NOT(非) 、XOR(异或) 。 关系操作符有 EQ(等于) 、NE (不等于) 、LT(小于) 、GT (大于) 、LE(小于等于) 、GE (大于等于) 。关系表达式的结果为逻辑值。当关系成立时,结果为全“1” ,即
8、为“真”;当关系不成立时,结果为全“0”,即为“ 假”。例如,设 VAR1=5,VAR2=6,则执行MOV AL,VAR1 GT VAR2的结果为 AL=00H(假) 。 数值回送操作符。数值回送操作符有 SEG(取段地址值) 、OFFSET(取偏移地址值) 、TYPE(取类型值) 、LENGTH(取长度值) 、SIZE(取大小值) 。 修改属性操作符 PTR。PTR 操作符的使用格式为类型 PTR 表达式其中,类型包括 BYTE(字节) 、WORD(字) 、DWORD(双字) 、NEAR(近程) 、FAR(远程) 。表达式包括变量、标号和地址表达式。PTR 操作符用于临时修改语句中操作数的属
9、性,完成同类型数据的匹配操作。例如,数据段定义的变量 DAT1 为字节类型,则语句MOV AX,DAT1;出现类型不匹配错误。利用 PTR 操作符可以修改 DAT1 的类型来修正语句中的错误。修改后的语句为MOV AX,WORD PTR DAT1。 其他运算符。其他运算符有 THIS(指定类型/ 距离属性运算符) 、HIGH(分离高字节运算符) 、LOW(分离低字节运算符) 。4. 注释域注释域以“;”号分隔,用来对程序或语句的功能加以注释。汇编时对此部分内容不作任何加工,仅作为源程序的说明,便于理解程序。注释部分虽然不属于程序本身的内容,但良好的注释是程序可读性的保障。3.2.2 伪指令伪指
10、令是在汇编语言源程序中使用的指令,用于定义不同的程序段、定义过程、分配存储空间、指定程序结束处等。汇编时伪指令不能转换为代码,因此被称为伪指令。1. 段定义伪指令一个汇编语言程序根据需要被划分为功能不同的几个段,一般至少应该有一个代码段和一个数据段,根据需要再增加堆栈段和附加数据段。程序执行时,不同的段被加载到不同的存储地址,因此编写程序时要对不同的段分别做出定义。段定义格式为段名 SEGMENT 定位类型组合类型类别定义内容段名 ENDS其中 SEGMENT 和 ENDS 是段定义伪指令助记符,必须成对出现,它们前面有相同的段名。段定义语句中的定位类型 、组合类型 、和类别 是 3 个可选项
11、,定位类型用于确定各段起始地址的规则;组合类型和类别用于模块化设计程序汇编时,告知连接程序LINK 各模块之间的通讯方式和各段之间的组合方式,从而把各模块正确地连接在一起。2. 过程定义伪指令过程也称为子程序,过程定义格式为过程名 PROC 类型定义内容过程名 ENDP其中 PROC 和 ENDP 是过程定义伪指令助记符,必须成对出现,它们前面有相同的过程名。定义语句中的类型是可选项,用于指出过程是属于 NEAR 类型还是 FAR 类型,若没有类型选项则默认为 NEAR 类型。3. 假定伪指令 ASSUME假定伪指令 ASSUME 用于为各定义的段指定使用的寄存器,便于汇编程序根据给定的段地址
12、和段内的偏移地址计算出各数据和程序代码的物理地址。假定伪指令 ASSUME的格式为ASSUME 段寄存器名:段名,段寄存器名:段名,例如,SSEG 、 DSEG 和 CSEG 是已经定义的堆栈段、数据段和代码段的段名,用ASSUME 伪指令假定的语句为ASSUME CS:DSEG,DS:DSEG,SS:SSEG;ASSUME 伪指令只是将段寄存器与相应段的关系通知了汇编程序,但没有把段首地址置入段寄存器中,CS 段寄存器的值是由系统自动置入,而 DS、SS 和 ES 的值需要在程序中用指令置入。例如,DSEG 和 CSEG 是已经定义的数据段和代码段,则它们的初始值置入的语句如下MOV AX,
13、DSEG; 取数据段的段地址MOV DS,AX; 装入数据段寄存器MOV AX,SSEG; 取堆栈段的段地址MOV SS,AX; 装入堆栈段寄存器4. 汇编地址计数器伪指令$汇编地址计数器伪指令用符号$表示,它用来记录正在汇编的程序语句的偏移地址,每安排 1 字节的数据或指令代码,$的值加 1。$中的初值可以用定位 ORG 伪指令设置,例如“ORG 0020H”,则$的初值被设置为 0200H。若不使用 ORG 伪指令定位,则$的初值伪0。5. 源程序结束伪指令 END汇编语言源程序结束时要使用 END 伪指令,其格式伪END 表达式其中可选项表达式必须是第一条可执行的程序语句的地址,可以是标
14、号或者是过程名。例如, “END START”。如果不带表达式,则该程序不能单独执行,只是供其他程序调用的子模块。3.2.3 汇编语言程序的格式汇编语言源程序可以按照主程序格式和过程格式来编写。1. 主程序编写格式汇编语言源程序一般由堆栈段、数据段和代码段组成,根据需要还包括附加段(例如使用字符串操作指令) 。汇编语言的主程序编写格式如下STACK SEGMENT STACK; 定义堆栈段DW 256 DUP(?);TOP LABEL WORD; 设置堆栈指针变量STACK ENDS;DATA SEGMENT; 定义数据段;DATA ENDS;CODE SEGMENT; 定义代码段ASSUME
15、 CS:CODE,DS:DATA,SS:STACK;START: MOV AX,DATA;MOV DS,AX; 设置数据段地址MOV AX,STACK;MOV SS,AX; 设置堆栈段地址MOV SP,OFFSET TOP;设置堆栈指针; 完成算法的程序段DONE: MOV AH,4CH;INT 21H; 程序结束,返回 DOS 操作系统CODE ENDS;END START; 源程序结束这是一个以主程序格式编写的汇编语言源程序的标准框架,编程时只需要在省略号的部分填写相应的数据和程序代码即可。2. 过程编写格式汇编语言程序的过程编写格式一般也包括堆栈段、数据段和代码段,其格式如下STACK
16、SEGMENT STACK; 定义堆栈段DW 256 DUP(?);TOP LABEL WORD; 设置堆栈指针变量STACK ENDS;DATA SEGMENT; 定义数据段;DATA ENDS;CODE SEGMENT; 定义代码段ASSUME CS:CODE,DS:DATA,SS:STACK;START PROC FAR; 定义过程PUSH DS; 保护 PSP 段地址XOR AX,AX;PUSH AX; 保护 PSP 的偏移地址MOV AX,DATA;MOV DS,AX; 设置数据段地址; 完成算法的程序段RET;START ENDP; 过程结束CODE ENDS;END START; 源程序结束汇编语言源程序都要经过汇编和连接才能生成可执行文件 exe,在 DOS 状态执行。在执行 exe 文件时,DOS 会在装载 exe 文件的前部建立一个 256 字节的程序段前缀PSP(program