1、第第4 4章章 汇编语言程序设计汇编语言程序设计4.1 4.1 汇编语言的基本知识汇编语言的基本知识4.2 4.2 汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.3 DOS4.3 DOS系统功能调用和系统功能调用和BIOSBIOS中断调用中断调用4.1 4.1 汇编语言的基本知识汇编语言的基本知识 学习汇编语言首先需要掌握相关的基本知识、基学习汇编语言首先需要掌握相关的基本知识、基本概念。熟悉基本语法和程序上机处理的过程。本概念。熟悉基本语法和程序上机处理的过程。4.1.1 4.1.1 汇编语言的基本概念汇编语言的基本概念 了解:了解:计算机的指令是由一个或多个字节二进制数组成的,这
2、种指计算机的指令是由一个或多个字节二进制数组成的,这种指令称为机器指令。二进制不易书写、记忆,使用不便,所以都不直接使令称为机器指令。二进制不易书写、记忆,使用不便,所以都不直接使用机器指令;而是使用助记符、符号等组成的符号指令。用符号指令书用机器指令;而是使用助记符、符号等组成的符号指令。用符号指令书写程序的语言称为汇编语言。把用汇编语言编写的源程序翻译成机器指写程序的语言称为汇编语言。把用汇编语言编写的源程序翻译成机器指令令(目标程序目标程序)的过程叫汇编。完成汇编任务的程序叫做汇编程序。的过程叫汇编。完成汇编任务的程序叫做汇编程序。1.1.机器语言与汇编语言机器语言与汇编语言 计算机程序
3、由一系列指令序列组成。计算机通过对每条指令的译码计算机程序由一系列指令序列组成。计算机通过对每条指令的译码和执行来完成相应的操作。指令必须以二进制代码的形式存放在内存中,和执行来完成相应的操作。指令必须以二进制代码的形式存放在内存中,才能够被计算机所识别和理解,并加以执行。由二进制代码表示的指令才能够被计算机所识别和理解,并加以执行。由二进制代码表示的指令称为机器指令,相应的程序称为机器语言程序。称为机器指令,相应的程序称为机器语言程序。机器语言程序由二进制代码组成,不便于编程和记忆。由此产生了机器语言程序由二进制代码组成,不便于编程和记忆。由此产生了用指令助记符表示的汇编语言指令,对应的程序
4、称为汇编语言程序。用指令助记符表示的汇编语言指令,对应的程序称为汇编语言程序。当数在当数在0000B1001B0000B1001B时,对应的时,对应的ASCIIASCII码为码为0909;当数在;当数在1010B1111B1010B1111B时,对应的时,对应的ASCIIASCII码为码为A-FA-F。设待转换的数据已在。设待转换的数据已在累加器累加器ALAL中(低中(低4 4位)。位)。80868086汇编语言程序如下:汇编语言程序如下:AND AL,0FH AND AL,0FH CMP AL,0AH CMP AL,0AH JB NUM JB NUM ADD AL,07H ADD AL,07
5、H NUM:ADD AL,30H NUM:ADD AL,30H RET RET 对【例对【例4-14-1】程序进行汇编以后,得到】程序进行汇编以后,得到80868086汇编指令对应的机器代汇编指令对应的机器代码(用十六进制数表示),如表码(用十六进制数表示),如表4-14-1所示。在表所示。在表4-14-1中,第一列表示机器中,第一列表示机器代码存放的内存地址,该地址与机器所处的环境有关;第二列表示代码存放的内存地址,该地址与机器所处的环境有关;第二列表示80868086机器代码,每条指令的机器代码由一个或几个字节组成;第三列表示汇机器代码,每条指令的机器代码由一个或几个字节组成;第三列表示汇
6、编指令,由指令助记符和操作数组成。指令前可能有标号,表示该指令编指令,由指令助记符和操作数组成。指令前可能有标号,表示该指令第一个字节所在的地址。第一个字节所在的地址。【例【例4-14-1】将将4 4位二进制数转换为位二进制数转换为ASCIIASCII码字符。码字符。地地 址址机器代码机器代码对应的汇编指令对应的汇编指令E380:0000E380:000024 0F24 0FAND AL,0FHAND AL,0FHE380:0002E380:00023C 0A3C 0ACMP AL,0AHCMP AL,0AHE380:0004E380:000472 0272 02JB NUMJB NUME38
7、0:0006E380:000604 0704 07ADD AL,07HADD AL,07HE380:0008E380:000804 3004 30NUM:ADD AL,30HNUM:ADD AL,30HE380:000AE380:000AC3C3RETRET表表4-1 汇编后的机器代码汇编后的机器代码1汇编语言仍然是各种系汇编语言仍然是各种系统软件(如操作系统)统软件(如操作系统)设计的基本语言。利用设计的基本语言。利用汇编语言可以设计出效汇编语言可以设计出效率极高的核心底层程序,率极高的核心底层程序,如设备驱动程序。迄今如设备驱动程序。迄今在许多高级应用编程中,在许多高级应用编程中,3232
8、位汇编语言编程仍然位汇编语言编程仍然占有较大的市场。占有较大的市场。2用汇编语言编写的程序用汇编语言编写的程序一般比用高级语言编写一般比用高级语言编写的程序执行得快,且所的程序执行得快,且所占内存较少。占内存较少。3汇编语言程序能够直汇编语言程序能够直接有效地利用机器硬接有效地利用机器硬件资源,在一些实时件资源,在一些实时控制系统中更是不可控制系统中更是不可缺少和代替。缺少和代替。2 2汇编语言与高级语言汇编语言与高级语言汇编语言的优点如下:汇编语言的优点如下:4.1.2 4.1.2 汇编语言的基本语法汇编语言的基本语法 1.1.语句格式语句格式 汇编语言语句的一般格式如下:汇编语言语句的一般
9、格式如下:名字名字 助记符助记符 操作数操作数 ;注释;注释 1 1)名字)名字 名字是自定义的标识符,一般最多由字母、数字和专用字符(如名字是自定义的标识符,一般最多由字母、数字和专用字符(如_ _、$、?、?、)组成。名字是可选的,通常用来表示本语句的符号地址,只有当)组成。名字是可选的,通常用来表示本语句的符号地址,只有当需要用符号地址来访问该语句时才需要。执行性语句中,名字是标号,后面需要用符号地址来访问该语句时才需要。执行性语句中,名字是标号,后面要跟冒号(:),表示该指令的逻辑地址;说明性语句中,名字可以是变量要跟冒号(:),表示该指令的逻辑地址;说明性语句中,名字可以是变量名、段
10、名、子程序名或宏名等,即可表示逻辑地址又具有自身的各种属性。名、段名、子程序名或宏名等,即可表示逻辑地址又具有自身的各种属性。2 2)助记符)助记符 助记符是操作码的助记符,它可以是指令、伪指令或宏指令名。指令助助记符是操作码的助记符,它可以是指令、伪指令或宏指令名。指令助记符可以是任意一条处理机指令,也可以是一条宏指令。记符可以是任意一条处理机指令,也可以是一条宏指令。3 3)操作数)操作数 指令的操作数可以是立即数、寄存器和存储器单元;伪指令的操作数可指令的操作数可以是立即数、寄存器和存储器单元;伪指令的操作数可以是常数、变量名、表达式等,可以有多个,操作数之间用逗号分隔。以是常数、变量名
11、、表达式等,可以有多个,操作数之间用逗号分隔。4 4)注释)注释 语句中由分号语句中由分号“;”开始的部分为注释内容,用来说明程序或语句的功开始的部分为注释内容,用来说明程序或语句的功能,以提高程序的可读性。注释可以在语句后,也可以从一行的第一个字符能,以提高程序的可读性。注释可以在语句后,也可以从一行的第一个字符开始。汇编程序对注释部分不作处理。开始。汇编程序对注释部分不作处理。5 5)分隔符)分隔符 语句的语句的4 4个部分之间要用分隔符隔开。标号后用冒号个部分之间要用分隔符隔开。标号后用冒号“:”,注释前用,注释前用分号分号“;”,操作数与操作数之间一般用逗号,操作数与操作数之间一般用逗
12、号“,”,其他部分之间则通常,其他部分之间则通常采用空格或制表符,多个空格与一个制表符的作用相同。采用空格或制表符,多个空格与一个制表符的作用相同。MASMMASM汇编器支持续汇编器支持续行符行符“”,即当一条汇编语言语句一行写不下时,可以使用续行符,即当一条汇编语言语句一行写不下时,可以使用续行符“”,然后转行到下一行继续书写。然后转行到下一行继续书写。【例【例4-24-2】将一个将一个8 8位二进制数分成高位二进制数分成高4 4位和低位和低4 4位分别转换为两个位分别转换为两个ASCIIASCII字字符。设待转换的数据及转换好的符。设待转换的数据及转换好的ASCIIASCII字符均存放在数
13、据段中。字符均存放在数据段中。完整的汇编语言源程序如下:完整的汇编语言源程序如下:NAME HEXTOASCNAME HEXTOASCDATA SEGMENT ;DATA SEGMENT ;数据段定义开始数据段定义开始HEX DB 5AHHEX DB 5AHASC DB 2 DUP(?)ASC DB 2 DUP(?)DATA ENDS ;DATA ENDS ;数据段定义结束数据段定义结束STACK SEGMENT ;STACK SEGMENT ;堆栈段定义开始堆栈段定义开始 DB 256 DUP(S)DB 256 DUP(S)TOP EQU$-STACKTOP EQU$-STACKSTACK
14、ENDS ;STACK ENDS ;堆栈段定义结束堆栈段定义结束CODE SEGMENT ;CODE SEGMENT ;代码段定义开始代码段定义开始 ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA ;START:MOV AX,DATA ;主程序开始主程序开始 MOV DS,AX MOV DS,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX MOV SP,TOP MOV SP,TOP MOV BX,OFFSET ASC MOV BX,
15、OFFSET ASC MOV AL,HEX MOV AL,HEX MOV AH,AL MOV AH,AL MOV CL,4 MOV CL,4 SHR AL,CL SHR AL,CL CALL NEAR PTR CONVERT CALL NEAR PTR CONVERT MOV BX,AL MOV BX,AL INC BX INC BX MOV AL,AH MOV AL,AH CALL NEAR PTR CONVERT CALL NEAR PTR CONVERT MOV BX,AL MOV BX,ALHLT ;HLT ;主程序结束主程序结束 CONVERT PROC ;CONVERT PROC
16、;过程过程(子程序子程序)定义开始定义开始 AND AL,0FH AND AL,0FH CMP AL,10 CMP AL,10 JB NUM JB NUM ADD AL,7 ADD AL,7NUM:ADD AL,0NUM:ADD AL,0 RET RETCONVERT ENDP ;CONVERT ENDP ;过程过程(子程序子程序)定义结束定义结束CODE ENDS ;CODE ENDS ;代码段定义结束代码段定义结束 END START ;END START ;程序结束程序结束 通过【例通过【例4-24-2】可以看出,汇编语言程序的每行语句由】可以看出,汇编语言程序的每行语句由1414个部分
17、组成。指令语句个部分组成。指令语句和伪指令语句在格式上稍有区别,指令语句的标号后有冒号和伪指令语句在格式上稍有区别,指令语句的标号后有冒号“:”,而伪指令语句的,而伪指令语句的标号后则没有冒号。标号后则没有冒号。(1 1)指令语句的格式:)指令语句的格式:LABEL LABEL:OPERATION OPERAND OPERATION OPERAND ;COMMENTCOMMENT 标号域标号域 指令助记符域指令助记符域 操作数域操作数域 注释域注释域 (2 2)伪指令语句的格式:)伪指令语句的格式:LABEL OPERATION OPERAND LABEL OPERATION OPERAND
18、;COMMENTCOMMENT 标号域标号域 伪指令助记符域伪指令助记符域 操作数域操作数域 注释域注释域 语句格式中用方括号括起来的部分,可以有也可以没有。每部分之间用空格语句格式中用方括号括起来的部分,可以有也可以没有。每部分之间用空格(至至少一个少一个)分开,一行最多可有分开,一行最多可有132132个字符。个字符。(3 3)标号)标号(label)(label):标号是一个自行设计的标识符命名规则前面已:标号是一个自行设计的标识符命名规则前面已讲述。但不能用数字开头,中间不能有空格,也不能为汇编语言的保留讲述。但不能用数字开头,中间不能有空格,也不能为汇编语言的保留字。字。注:保留字指
19、有专门用途的字符或字符串,如注:保留字指有专门用途的字符或字符串,如CPUCPU的寄存器名、指的寄存器名、指令助记符、伪指令助记符等。令助记符、伪指令助记符等。标号一般表示变量名、段名、过程名或指令符号地址。变量名、段标号一般表示变量名、段名、过程名或指令符号地址。变量名、段名和过程名由专门的伪指令语句定义,而指令符号地址则根据需要在标名和过程名由专门的伪指令语句定义,而指令符号地址则根据需要在标号域中写上,后面跟号域中写上,后面跟“:”。在同一个汇编单位(以在同一个汇编单位(以ENDEND结束的程序模块)中,标号域中的标号结束的程序模块)中,标号域中的标号不能相同。不能相同。(4 4)操作数
20、域)操作数域(operand fields)(operand fields):操作数可以是常数、变量、标号、:操作数可以是常数、变量、标号、寄存器名或表达式。寄存器名或表达式。1 1)算术表达式)算术表达式算术表达式是由算术运算符连接常量、变量组成的表达式。算术运算符包括、算术表达式是由算术运算符连接常量、变量组成的表达式。算术运算符包括、*、/、MODMOD,分别实现加、减、乘、除、取余的算术运算。,分别实现加、减、乘、除、取余的算术运算。(1 1)MODMOD也称为取模,它得到除法之后的余数。也称为取模,它得到除法之后的余数。(2 2)、运算符还可用于地址表达式,通常是一个地址与一个数值相
21、加减,)、运算符还可用于地址表达式,通常是一个地址与一个数值相加减,而两个地址相乘、相除是无意义的。而两个地址相乘、相除是无意义的。注意:两个不同段的地址相加是无意义的。注意:两个不同段的地址相加是无意义的。(3 3)除加减运算外,其他运算符的操作数必须是整数。例如:)除加减运算外,其他运算符的操作数必须是整数。例如:MOV AXMOV AX,3 3*(6 64 4)5 5;MOV AXMOV AX,1111MOV BXMOV BX,2+2+(15 MOD 615 MOD 6);MOV BXMOV BX,5 52.2.表达式表达式 2 2)逻辑表达式)逻辑表达式 逻辑表达式由逻辑运算符连接常量
22、、变量组成的表达式。逻辑运算逻辑表达式由逻辑运算符连接常量、变量组成的表达式。逻辑运算符包括两大类:逻辑运算符和移位运算符。符包括两大类:逻辑运算符和移位运算符。(1 1)逻辑运算符。逻辑运算符包括:)逻辑运算符。逻辑运算符包括:ANDAND、OROR、NOTNOT、XORXOR,分别实,分别实现按位相与、相或、求反、异或的逻辑运算。例如:现按位相与、相或、求反、异或的逻辑运算。例如:MOV AX MOV AX,34H AND 20H34H AND 20H;相当于;相当于MOV AXMOV AX,20H20H MOV BX MOV BX,34H OR 20H34H OR 20H;相当于;相当于
23、MOV BXMOV BX,34H34H,MOV CX MOV CX,NOT 34HNOT 34H;相当于;相当于MOV CXMOV CX,0CBH0CBH MOV DX MOV DX,34H XOR 20H34H XOR 20H;相当于;相当于MOV DXMOV DX,14H14H (2 2)移位运算符。移位运算符包括)移位运算符。移位运算符包括SHLSHL和和SHRSHR,分别实现逻辑左移和,分别实现逻辑左移和逻辑右移运算,移入低位或高位的是逻辑右移运算,移入低位或高位的是0 0。其格式为:。其格式为:数值表达式数值表达式 SHL/SHR SHL/SHR 移位次数移位次数 例如:例如:MOV
24、 AX MOV AX,20H SHL 220H SHL 2;相当于;相当于MOV AXMOV AX,80H80H MOV BX MOV BX,20H SHR 220H SHR 2;相当于;相当于MOV AXMOV AX,08H08H3 3)关系表达式)关系表达式 关系表达式由关系运算符连接常量、变量组成的表达。关系运算符包括关系表达式由关系运算符连接常量、变量组成的表达。关系运算符包括EQEQ(相等)、(相等)、NENE(不相等)、(不相等)、GTGT(大于)、(大于)、LTLT(小于)、(小于)、GEGE(大于等于)、(大于等于)、LELE(小于等于),用于比较和测试符号数值。关系运算符连接
25、的操作数必须(小于等于),用于比较和测试符号数值。关系运算符连接的操作数必须是数值或同一段内的两个存储单元地址。关系表达式的运算结果为逻辑值是数值或同一段内的两个存储单元地址。关系表达式的运算结果为逻辑值(真或假),(真或假),MASMMASM汇编器用汇编器用FFFFHFFFFH(补码(补码1 1)表示逻辑真,用)表示逻辑真,用0000H0000H表示逻表示逻辑假。例如:辑假。例如:MOV AX MOV AX,(,(PORT LE 5PORT LE 5)AND 20HAND 20H)OR OR(PORT GT 5PORT GT 5)AND 30HAND 30H)当当PORT5PORT5时,汇编
26、的结果为时,汇编的结果为MOV AXMOV AX,20H20H。当当PORTPORT5 5时,汇编的结果为时,汇编的结果为MOV AXMOV AX,30H30H。此外,在数值表达式中还经常用到高低分离符。该类运算符包括此外,在数值表达式中还经常用到高低分离符。该类运算符包括HIGHHIGH(高字节)、(高字节)、LOWLOW(低字节)、(低字节)、HIGHWORDHIGHWORD(高字)、(高字)、LOWWORDLOWWORD(低字)。(低字)。(1 1)字节分离符)字节分离符HIGHHIGH和和LOWLOW,分别取一个数值常量或符号常量的高字节或低字节部分。,分别取一个数值常量或符号常量的高
27、字节或低字节部分。(2 2)字分离符)字分离符HIGHWORDHIGHWORD和和LOWWORDLOWWORD,从,从MASM 6.0MASM 6.0引入的,分别取一个符号常量的高字或低引入的,分别取一个符号常量的高字或低字部分。字部分。例如:例如:CONT_WCONT_WDWDW034ABH034ABH;字变;字变量定义伪指令量定义伪指令CONT_DWCONT_DW DD DD12345678H12345678H;双字变量定义伪;双字变量定义伪指令指令MOV ALMOV AL,HIGH 869AHHIGH 869AH;相当;相当于于MOV ALMOV AL,86H86HMOV BLMOV B
28、L,LOW CONT_WLOW CONT_W;相当;相当于于MOV BLMOV BL,0ABH0ABHMOV DXMOV DX,HIGHWORD CONT_DWHIGHWORD CONT_DW;相当于;相当于MOV DXMOV DX,1234H1234H 如前所述,伪指令语句只是用来指示、引导汇编程序在汇编时做一些操如前所述,伪指令语句只是用来指示、引导汇编程序在汇编时做一些操作,它不产生机器代码,本身也不占用存储单元。作,它不产生机器代码,本身也不占用存储单元。1 1)段定义伪指令)段定义伪指令 SEGMENT SEGMENT和和ENDSENDS为程序分段的定义,其格式如下:为程序分段的定义
29、,其格式如下:段名段名 SEGMENT SEGMENT 定位方式定位方式 组合方式组合方式 类别名类别名 指令语句或伪指令语句指令语句或伪指令语句 段名段名 ENDS ENDS (1 1)段名。段名是赋予该段的一个名称,它位于)段名。段名是赋予该段的一个名称,它位于SEGMENTSEGMENT与与ENDSENDS伪指令伪指令之前,成对出现,且前后必须一致。段名的取法与标号、变量名等相同。在之前,成对出现,且前后必须一致。段名的取法与标号、变量名等相同。在同一个模块中,不同段的段名不能相同。同一个模块中,不同段的段名不能相同。段名代表该段的段地址。例如,【例段名代表该段的段地址。例如,【例4-2
30、4-2】中的指令:】中的指令:MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX 表示取数据段的段地址表示取数据段的段地址(用段名表示用段名表示)送送AXAX,然后再将,然后再将AX(AX(段地址段地址)送数据送数据段寄存器段寄存器DSDS。3.3.伪指令伪指令 (2 2)定位方式。程序的段必须连续放置在内存单元的某个区域,并占据)定位方式。程序的段必须连续放置在内存单元的某个区域,并占据一定的存储空间。为了对程序的段进行合理的管理,需要对段放置的起始地一定的存储空间。为了对程序的段进行合理的管理,需要对段放置的起始地址进行规定,这就是定位方式的作用。有址进
31、行规定,这就是定位方式的作用。有4 4种定位类型:种定位类型:BYTEBYTE、WORDWORD、PARAPARA、PAGEPAGE。起始地址分别为(。起始地址分别为(X X表示表示0 0或或1 1):):BYTE XXXX XXXX XXXX XXXX XXXXB BYTE XXXX XXXX XXXX XXXX XXXXB WORD XXXX XXXX XXXX XXXX XXX0B WORD XXXX XXXX XXXX XXXX XXX0B PARA XXXX XXXX XXXX XXXX 0000B PARA XXXX XXXX XXXX XXXX 0000B PAGE XXXX X
32、XXX XXXX 0000 0000B PAGE XXXX XXXX XXXX 0000 0000B 分别表示以字节、字、节、页的边界为起始地址。如果缺省定位方式,分别表示以字节、字、节、页的边界为起始地址。如果缺省定位方式,则以节(则以节(PARAPARA)的边界为起始地址。一节包含)的边界为起始地址。一节包含1616个连续的字节单元,一页包个连续的字节单元,一页包含含256256个连续的字节单元。个连续的字节单元。(3 3)组合方式。对于规模较大的程序,常将程序分割为多个模块。在不)组合方式。对于规模较大的程序,常将程序分割为多个模块。在不同的模块中,段名可以相同,组合方式的作用是指示连接
33、程序,把同名的段同的模块中,段名可以相同,组合方式的作用是指示连接程序,把同名的段按照指定的方式组合起来形成一个新的段。组合方式共有按照指定的方式组合起来形成一个新的段。组合方式共有6 6种。种。NONE NONE:表示该段与其他模块的段没有任何关系,每段都有自己的基址。:表示该段与其他模块的段没有任何关系,每段都有自己的基址。这是缺省方式。这是缺省方式。PUBLIC PUBLIC:表示该段与其他模块中说明为:表示该段与其他模块中说明为PUBLICPUBLIC方式的同名段互相组合成方式的同名段互相组合成一个逻辑段,逻辑段的长度为各段长度之和。一个逻辑段,逻辑段的长度为各段长度之和。STACK
34、STACK:表示此段为堆栈段,连接时把所有:表示此段为堆栈段,连接时把所有STACKSTACK方式的同名段连接成一方式的同名段连接成一个段,由个段,由SSSS指向该段的起始地址。指向该段的起始地址。COMMON COMMON:表示该段与其他模块中所有已说明为:表示该段与其他模块中所有已说明为COMMONCOMMON的同名段共享相同的同名段共享相同的存储区域,共享的长度为模块同名段中最大长度,各共享段具有相同的段的存储区域,共享的长度为模块同名段中最大长度,各共享段具有相同的段起始地址。起始地址。MEMORY MEMORY方式:表示该段应定位在所有其他段的上面。若有多个段选用方式:表示该段应定位
35、在所有其他段的上面。若有多个段选用MEMORYMEMORY,则除第一个之外,其余段均作为,则除第一个之外,其余段均作为COMMONCOMMON处理。处理。AT AT:表示该段按绝对地址定位,其段地址即为其后表达式的值,位移量:表示该段按绝对地址定位,其段地址即为其后表达式的值,位移量为为0 0。2 2)ORGORG伪指令伪指令 ORG ORG伪指令把数据表达式的值赋予位置计数器。通过伪指令把数据表达式的值赋予位置计数器。通过ORGORG伪指令,可以将伪指令,可以将位置计数器设置为新值,以便其后的指令性语句或数据定义语句从指定的位位置计数器设置为新值,以便其后的指令性语句或数据定义语句从指定的位
36、置进行汇编。置进行汇编。ORGORG伪指令格式为:伪指令格式为:ORG ORG 数据表达式数据表达式 例如,【例例如,【例4-24-2】中变量】中变量HEXHEX的原来位置为数据段中的原来位置为数据段中0000H0000H单元,现单元,现将该变量放到将该变量放到0100H0100H单元:单元:ORG 0100HORG 0100HHEX DB 5AHHEX DB 5AH 3 3)段寻址伪指令)段寻址伪指令ASSUMEASSUME SEGMENT/ENDS SEGMENT/ENDS可以用来定义不同的段。尽管取了一些意义明显的段可以用来定义不同的段。尽管取了一些意义明显的段名,如名,如DATADAT
37、A,CODECODE,STACKSTACK等,但汇编程序仍然不知道哪个对应数据段,等,但汇编程序仍然不知道哪个对应数据段,哪个对应代码段,哪个对应堆栈段。因此,用哪个对应代码段,哪个对应堆栈段。因此,用ASSUMEASSUME伪指令来说明段寄伪指令来说明段寄存器与段名之间的对应关系,以便能够正确汇编。存器与段名之间的对应关系,以便能够正确汇编。ASSUME ASSUME语句的一般格式为语句的一般格式为:ASSUME ASSUME 段寄存器:段名段寄存器:段名,段寄存器:段名,段寄存器:段名,其中,段寄存器有其中,段寄存器有CSCS、DSDS、ESES、SSSS。每个指定之间用逗号分开。例如,。
38、每个指定之间用逗号分开。例如,【例【例4-24-2】中段的说明语句为:】中段的说明语句为:ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACK 表示表示CODECODE为代码段,为代码段,DATADATA为数据段,为数据段,STACKSTACK为堆栈段。该程序中没为堆栈段。该程序中没有用到附加段。有用到附加段。4 4)过程定义伪指令)过程定义伪指令PROC/ENDPPROC/ENDP 过程即是子程序。汇编语言规定必须对过程进行定义,以确定过程的三种属性。过过程即是子程序。汇编语言规定必须对过程进行定义,以确定过程的三种属
39、性。过程的属性确定之后,就可对调用指令程的属性确定之后,就可对调用指令CALLCALL进行正确汇编,决定是产生近调用指令还是进行正确汇编,决定是产生近调用指令还是远调用指令。近调用时,只需将返回位置的偏移地址压栈,而远调用时,需将返回位远调用指令。近调用时,只需将返回位置的偏移地址压栈,而远调用时,需将返回位置的偏移地址和段地址都压入堆栈。置的偏移地址和段地址都压入堆栈。(1 1)过程的三种属性。)过程的三种属性。段属性:过程所在段的段地址。段属性:过程所在段的段地址。偏移量属性:过程所处位置的段内偏移地址。偏移量属性:过程所处位置的段内偏移地址。类型属性:类型属性:NEARNEAR和和FAR
40、FAR。NEARNEAR表示近过程,该过程与调用指令表示近过程,该过程与调用指令CALLCALL处在同一个代码段中处在同一个代码段中(段名相同);(段名相同);FARFAR表示远过程,该过程与调用指令表示远过程,该过程与调用指令CALLCALL处在不同的代码段中(段名不处在不同的代码段中(段名不同)。同)。(2 2)过程的定义。过程定义的格式如下:)过程的定义。过程定义的格式如下:过程名过程名 PROC NEAR/FAR PROC NEAR/FAR 语句语句 RET RET 过程名过程名 ENDP ENDP1.1.建立开发环境建立开发环境为了开发汇编程序,至少要在磁盘上建立以下文件:为了开发汇
41、编程序,至少要在磁盘上建立以下文件:编辑程序:如编辑程序:如EDIT.EXEEDIT.EXE。汇编程序:如汇编程序:如MASM.EXEMASM.EXE、ML.EXEML.EXE。连接程序:如连接程序:如LINK.EXELINK.EXE。调试程序:如调试程序:如DEBUG.EXEDEBUG.EXE。另外,另外,MASM 6.0MASM 6.0汇编系统中还包括以下几个文件:汇编系统中还包括以下几个文件:ML.ERRML.ERR:汇编错误信息文件。:汇编错误信息文件。DOSXNT.EXEDOSXNT.EXE:MS-DOSMS-DOS扩展文件。扩展文件。LIB.EXELIB.EXE:子程序库管理文件。
42、:子程序库管理文件。4.1.3 4.1.3 汇编语言和汇编处理过程汇编语言和汇编处理过程 2 2.源程序的编辑源程序的编辑 汇编语言源程序是汇编语言源程序是ASCIIASCII文本文件,可以使用任何文本编辑器。例如,文本文件,可以使用任何文本编辑器。例如,DOSDOS下的文本编辑器下的文本编辑器EDITEDIT,WindowsWindows下的记事本,或高级语言开发环境的下的记事本,或高级语言开发环境的编辑器(如编辑器(如Turbo CTurbo C),又或者是),又或者是MASMMASM集成开发环境等。集成开发环境等。汇编语言源程序以汇编语言源程序以.ASM.ASM为扩展名,下面以在显示器上
43、输出字符串为扩展名,下面以在显示器上输出字符串STRINGSTRING为例,介绍在命令行方式下汇编语言程序的开发过程。为例,介绍在命令行方式下汇编语言程序的开发过程。3 3.源程序的汇编源程序的汇编 汇编是将源程序翻译成由机器代码组成的目标程序的过程。汇编是将源程序翻译成由机器代码组成的目标程序的过程。MASM MASM 6.06.0以前的汇编程序是以前的汇编程序是MASM.EXEMASM.EXE,MASM 6.0MASM 6.0以后又引入了以后又引入了ML.EXEML.EXE。以下。以下给出给出4-3.ASM4-3.ASM分别在分别在MASM 5.0MASM 5.0、MASM 6.15MAS
44、M 6.15下的汇编过程。下的汇编过程。4 4.目标文件的连接目标文件的连接 连接程序连接程序LINK.EXELINK.EXE将一个或多个目标文件和库文件连接生成可执行将一个或多个目标文件和库文件连接生成可执行程序(程序(.EXE.EXE或或.COM.COM文件)。文件)。5.5.调试及运行调试及运行 汇编语言源程序经过汇编、连接后,生成可执行程序,在程序目汇编语言源程序经过汇编、连接后,生成可执行程序,在程序目录下输入文件名,便可以直接运行了,操作系统装载该文件进入主存,录下输入文件名,便可以直接运行了,操作系统装载该文件进入主存,开始运行。如果出现运行错误,可以从源程序开始排错,也可以利用
45、开始运行。如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误。调试程序帮助发现错误。4.2 4.2 汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.2.1 4.2.1 顺序结构程序设计顺序结构程序设计顺序程序又称作简单程序。它一般是根据算法编出的完全顺序执行的程序。顺序程序又称作简单程序。它一般是根据算法编出的完全顺序执行的程序。数据类型不匹配。数据类型不匹配。计算机资源的使用有冲突。计算机资源的使用有冲突。忽视汇编语言指令的一些缺省忽视汇编语言指令的一些缺省的条件。的条件。虽然顺序结虽然顺序结构的流程很构的流程很简单,但是简单,但是很多学生在很多学生在编写程序时编
46、写程序时会出现一些会出现一些问题,主要问题,主要有:有:【例【例4-44-4】将变量将变量X X的值加上变量的值加上变量Y Y的值,结果保存在变量的值,结果保存在变量Z Z中。中。分析:这个题目的流程很简单,但是要注意汇编语言的语法特点。分析:这个题目的流程很简单,但是要注意汇编语言的语法特点。程序如下:程序如下:;数据段;数据段DATA SEGMENTDATA SEGMENT X DB 6 X DB 6 ;X X是一个字节类型的变量是一个字节类型的变量 Y DB 9 Y DB 9 ;Y Y是一个字节类型的变量是一个字节类型的变量 Z DB Z DB?;Z Z是一个字节类型的变量是一个字节类型
47、的变量DATA ENDSDATA ENDS;代码段;代码段CODE SEGMENTCODE SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATASTARTSTART:MOV AXMOV AX,DATA DATA;DATADATA不能直接赋值给不能直接赋值给DSDS MOV DS MOV DS,AX AX ;对;对DSDS赋值赋值 MOV AL MOV AL,X X ;存储器寻址方式不能确定数据类型;存储器寻址方式不能确定数据类型 MOV BL MOV BL,Y Y ;X X、Y Y先分别送到不同的字节(先分别送到不同的字节(8 8位)寄存器中位)
48、寄存器中 ADD AL ADD AL,BLBL MOV Z MOV Z,ALAL HLT HLTCODE ENDSCODE ENDS END START END START4.2.2 4.2.2 分支程序设计分支程序设计 顺序程序的特点是从程序的第一条指令开始,按顺序执行,直到顺序程序的特点是从程序的第一条指令开始,按顺序执行,直到最后一条指令。然而,许多实际问题并不能设计成顺序程序,需要根最后一条指令。然而,许多实际问题并不能设计成顺序程序,需要根据不同的条件作出不同的处理。把不同的处理方法编制成各自的处理据不同的条件作出不同的处理。把不同的处理方法编制成各自的处理程序段,运行时由机器根据不
49、同的条件自动作出选择判别,绕过某些程序段,运行时由机器根据不同的条件自动作出选择判别,绕过某些指令,仅执行相应的处理程序段。按这种方式编制的程序,执行的顺指令,仅执行相应的处理程序段。按这种方式编制的程序,执行的顺序与指令存储的顺序失去了完全的一致性,称之为分支程序。分支程序与指令存储的顺序失去了完全的一致性,称之为分支程序。分支程序是机器利用改变标志位的指令和转移指令来实现的。序是机器利用改变标志位的指令和转移指令来实现的。【例【例4-74-7】设有单字节无符号数设有单字节无符号数X X、Y Y、ZZ,若,若X+Y255X+Y255,则求,则求X+ZX+Z,否则求,否则求X-ZX-Z,运算,
50、运算结果放在结果放在F1F1中。中。分析:因为分析:因为X X,Y Y均为无符号数,所以当均为无符号数,所以当X+Y255X+Y255时则会产生进位即时则会产生进位即CF=1CF=1,所以可以用,所以可以用进位标志来判断。进位标志来判断。程序段如下:程序段如下:;数据段;数据段DATA SEGMENTDATA SEGMENT X DB 128 X DB 128 Y DB 90 Y DB 90 Z DB 50 Z DB 50 F1 DB F1 DB?DATA ENDSDATA ENDS;代码段;代码段CODE SEGMENTCODE SEGMENT ASSUME CS ASSUME CS:COD