1、 第五章 汇编语言基础5.1 汇编语言的基本概念 汇编语言是用指令助记符,符号地址和标号书写的语言。用汇编语言编写的程序称为汇编语言源程序。汇编语言源程序必须进行加工翻译转换为机器语言程序。将源程序翻译成机器语言程序的过程叫汇编。完成这种工作的语言程序称为汇编程序。汇编程序是一种系统软件。IBM PC 系统配置了两种汇编程序:一种称为小汇编的ASM,另一种是宏汇编MASM。目前,一般多用宏汇编MASM。*程序设计语言程序设计语言 机器语言 汇编语言:机器语言的符号化,与机器密切相关。高级语言*汇编语言的意义汇编语言的意义 速度:对于同一个问题,用汇编语言设计出的程序能达到“运行速度最快”。空间
2、:对于同一个问题,用汇编语言设计出的程序能达到“占用空间最少”。功能:汇编语言可以实现高级语言难以胜任甚至不能完成的任务。知识:学习汇编语言,有助于对计算机系统的理解、写出更好的程序。511 汇编语言的基本语法1字符集8086/8088 宏汇编语言规定可以使用的字符详见P77-782标示符标示符在程序中用作变量名,常量名,记录名和段名等具体規定见P783保留字8086/8088中指令助记符,伪指令,寄存器名,表达式运算符及属性操作符等均为保留字。保留字不能当作标示符使用。4语句80X86宏汇编有两种基本语句宏汇编有两种基本语句:指令语句指令语句和伪指令语句伪指令语句指令语句对应机器的一种操作,
3、汇编后产生一个目标代码;伪指令是帮助汇编的,不产生目标代码,与机器操作无关;一条语句在源程序中一般只占一行,长度超过一行时必须用续行符号(&)(1)指令语句:一般格式如下一般格式如下:标号:标号:前缀前缀指令助记符指令助记符 操作数操作数;注释;注释其中:标号:表示该指令语句的存储器地址,供 转移指令,调用指令或循环指令作为操作数使用;前缀:是一些必须和其他指令配合使用的特殊指令;指令助记符:是指令中的关键字,不可缺省;操作数:指令要处理的数据,可以是一个或两个,也可没有(隐含);注释:说明指令功能;(2)伪指令语句:一般格式如下一般格式如下:名字伪操作命令操作数;注释 名字可以是符号名,常量
4、名,变量名,过程名和段名等,后面不能有“:”,是和指令语句的显著区别。伪指令命令:主要包括符号定义,变量定义,程序分段定义,过程定义,模块定义,和宏定义等。操作数随伪操作命令的不同而不同,它们的格式和定义将在后面的章节中一一介绍。5汇编语言程序结构由指令、伪指令、变量、标号等组合起来写出的程序成为源程序,一个汇编语言的源程序由若干个段和一行表示程序结束的伪指令组成。80X86宏汇编语言规定程序中最多可包括四种类型的段即:代码段,数据段,堆栈段和附加段,每个段在程序中的先后不定,数目也不定,但必须有段名。综上所述,用汇编语言编写的程序,在结构上具有以下特点:(1)由若干逻辑段组成,各逻辑段包括伪
5、指令语句定义和说明;(2)整个源程序以伪指令END结束;(3)每个逻辑段由语句序列组成,各语句可以是指令语句、伪指令语句、宏指令语句、注释语句或空行语句。单模块汇编语言源程序的结构 DATE SEGMENT数据定义伪指令序列 ;定义数据段 DATE ENDS STACK SEGMENT STACK 堆栈定义伪指令序列 ;定义堆栈段 STACK ENDS CODE SEGMENT 程序段 ;定义代码段 CODE ENDS END 标号在实际应用中,把一个独立汇编的源程序称为一个模块。一个大程序可由几个模块组成,每个模块具有不同的功能,这些模块分别汇编成目标代码后,再用连接程序把它们连接成一个可执
6、行程序,其中只有一个模块可以指出程序的启动地址,该模块称为主模块。这就是汇编语言程序设计上机顺序:首先编写源程序,其次汇编,然后连接,最后执行。编辑程序编辑程序ASM文件文件OBJ文件文件汇编程序汇编程序EXE文件文件连接程序连接程序 汇编语言程序的处理过程汇编语言程序的处理过程常见的汇编程序有以下两种类型:1行汇编程序:对汇编语言源程序进行逐条汇编,常见的IBM PC动态调试程序DEBUG中的A命令就属于这种汇编类型。2宏汇编程序:对扩展名为ASM的汇编语言源程序进行汇编,产生扩展名为OBJ的可重定位的目标代码文件,然后用链接程序LINK链接一个或多个OBJ模块(包括库文件),产生一个扩展名
7、为EXE的可执行目标文件(P80)具体进行汇编处理的过程如下:建立源程序;产生目标代码;链接目标程序;运行和调试;一个简单的例子一个简单的例子 CODE SEGMENT ASSUME CS:CODE MAIN MOV AH,2 MOV DL,A INT 21H MOV AH,4CH INT 21HCODE ENDS END MAIN 本程序功能在屏幕上输出一个大写字母A。52 80X86 指令基础 521 指令格式 1指令和指令系统 指令是计算机能够识别和执行的某种操作命令。一种计算机中所有指令的集合称为该计算机的指令系统。可分为如下几类:(1)数据传送指令(2)算术运算指令(3)逻辑运算指令
8、(4)移位运算指令(5)位与位串操作指令(6)控制转移指令(7)输入/输出指令(8)其他指令2指令格式前缀操作码寻址方式偏移量立即数03字节 1 2字节 1 2字节 1 4字节 1 4字节 80X86机器指令编码的一般格式机器指令编码的一般格式操作码操作码MOD字节 偏移量偏移量操作码操作码MOD字节DATA/DISP操作码操作码MOD字节DATA/DISPLDATA/DISPL操作码操作码MOD字节DATA/DISPLDATA/DISPH DATA操作码操作码MOD字节DATA/DISPLDATA/DISPH DATAL DATAH 8086 CPU 指令形式指令形式第1字节为操作码字节,其
9、构成如下:操作码DW7 2 1 0 8086中指令操作码的长度是固定的,一般占第一字节中的72位;D指示操作方向:D=0 表示REG指出的寄存器是源操作;D=1 表示REG指出的寄存器是目的操作数;W指示是16位寄存器还是8位寄存器参加操作:W=1 16位寄存器参加操作;W=0 8位寄存器参加操作;第第2字节为字节为MOD字节,其构成为:字节,其构成为:MOD REG R/M其中MOD占两位,为寻址方式指示位。MOD 寻 址 方 式0 0存储器寻址方式,无偏移量字节0 1存储器寻址方式,一字节偏移量1 0存储器寻址方式,两字节偏移量1 1寄存器寻址方式REG指示参加操作的寄存器编码;R/M字段
10、可以指示参加操作的寄存器编码,也可以指示有效地址的计算方法。522 寻址方式寻址方式 寻址方式是指令中用于说明操作数所在地址的方法,这里只讨论操作数的寻址方式。80 x86系列计算机有8种基本的操作数寻址方式,其中比例变址寻址只在80386以上的微处理器中使用。1立即寻址:又称立即数寻址。操作数直接放在指令中成为立即数,立即数规定只能是整数。例如:MOV AL,30 ;十进制形式的立即数 MOV AX,3030H;十六进制形式的立即数 MOV AL,11001101B MOV AL,3 ;字符形式的立即数立即寻址还有一些比较复杂的情况。如果操作数是由数字和运算符构成的表达式,汇编语言在汇编时会
11、计算出表达式的值,并将计算结果以立即数的形式翻译到机器指令中。MOV AL,3-30H 1.立即寻址方式立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中码一起存入代码段中。立即数有立即数有8位和位和16位位,只能为整数。只能为整数。80X86或更高档机器中,立即数也可以是双字等。或更高档机器中,立即数也可以是双字等。例例:MOV AL,5 ;源操作数为立即寻址;源操作数为立即寻址指令执行后,指令执行后,AL=05H,8位数据位数据05H存入存入AL寄存器。寄存器。例例:MOV AX,3064H ;源操作数为立即寻址;
12、源操作数为立即寻址指令执行后,指令执行后,AX=3064H,16位数据位数据3064H存入存入AX寄存寄存器。器。立即数只能是源操作数,此种寻址方式主要用于对寄立即数只能是源操作数,此种寻址方式主要用于对寄存器赋值。操作数在指令中,执行速度快。存器赋值。操作数在指令中,执行速度快。2.寄存器寻址方式寄存器寻址方式 寄存器寻址方式的操作数是寄存器的值,指令中直寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括接使用寄存器名,包括8位或位或16位通用寄存器。位通用寄存器。可使用可使用的的16位寄存器:位寄存器:AX、BX、CX、DX(通用寄存器)、通用寄存器)、SI(源变址寄存器)、
13、(源变址寄存器)、DI(目的变址寄存器)、(目的变址寄存器)、SP(堆栈指针寄存器)、(堆栈指针寄存器)、BP(基址寄存器);其中:(基址寄存器);其中:AX、BX、CX、DX可分成两可分成两8位使用。位使用。例:例:MOV AX,CX MOV AL,BL MOV AX,2056H 对于对于80386或更高档机器中,立即数可为双字或更高档机器中,立即数可为双字 例如:例如:MOV EBX,12345678H 2寄存器寻址:寄存器寻址:操作数在操作数在CPU的内部寄存器中,的内部寄存器中,指令指出寄存器名。(指令指出寄存器名。(P83)例如:例如:MOV AL,BL ;(BL)AL MOV AL
14、,DH MOV AX,SI要注意数据匹配。要注意数据匹配。3.内存寻址方式内存寻址方式 操作数寻址方式主要分为三类,其中内存寻址方操作数寻址方式主要分为三类,其中内存寻址方式最复杂。在内存寻址方式中,操作数是某个内存单式最复杂。在内存寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地元的内容(值),指令中给出的是内存单元的有效地址址EA(即偏移地址),段地址通常在隐含的某个段(即偏移地址),段地址通常在隐含的某个段寄存器中。寄存器中。一直接寻址:一直接寻址:直接寻址方式的操作数地址的直接寻址方式的操作数地址的16位位偏移量(又称有效地址偏移量(又称有效地址EA)直接包
15、含在指令中。)直接包含在指令中。例如:例如:MOV AX,DS:2000H假设假设(DS)=3000H,则物理地址为则物理地址为32000H.如果指令无前缀,则默认操作数存放在数据段寄存如果指令无前缀,则默认操作数存放在数据段寄存器器DS中。它存放在代码段中指定操作码之后,但操作中。它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。作数的物理地址,然后再访问存储器才能取得操作数。例如:例如:MOV AX,2000H MOV AX,ES:2000H在汇编语言中,经常使用
16、符号地址代替数值地址。在汇编语言中,经常使用符号地址代替数值地址。例如:例如:Mov ax,3000h 寻址示意图寻址示意图二寄存器二寄存器间接间接寻址:寻址:在这种寻址方式中,寄存器中存放的是操作数地址的在这种寻址方式中,寄存器中存放的是操作数地址的16位偏移量,位偏移量,注意这里使用的寄存器只有注意这里使用的寄存器只有4个个。基址寄存器基址寄存器(BX、BP)和变址寄存器和变址寄存器(SI、DI)(BX、SI、DI、BP)前三个寄存器对应的缺省段寄存前三个寄存器对应的缺省段寄存器是器是DS;BP对应的缺省段寄存器是对应的缺省段寄存器是SS。如果需要,寄存器间接寻址方式也可以使用段跨越如果需
17、要,寄存器间接寻址方式也可以使用段跨越例如:例如:MOV AL,DS:BP MOV AL,ES:BX MOV AL,SS:DI 例如:例如:MOV AX,BP 寻址示意图寻址示意图 操作数在存储器中,指令中寄存器内容作为操作数所操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。在单元的有效地址。(BX)(SI)(DI)(BP)有效地址有效地址=段寄存器为段寄存器为DS段寄存器为段寄存器为SS物理地址计算方法:物理地址计算方法:物理地址物理地址 =(DS)*16 +(BX)或()或(SI)或()或(DI)物理地址物理地址 =(SS)*16 +(BP)例:已知:(例:已知:(DS)=
18、2100H,(,(DI)=2000H 指令:指令:MOV AX,DI ;(;(AX)(DI)物理地址物理地址=(DS)*16 +(DI)=2100H *16 +2000H =21000H +2000H =23000H 指令结果:将指令结果:将23000H单元内容送单元内容送AL中,中,将将23001H单元内容送单元内容送AH中。中。直接寻址和寄存器间接寻址,是汇编语言中内存型操作数最常用的两种方式。如果与高级语言相比,直接寻址相当于高级语言中的整数,字符等类型的简单变量,而寄存器间接寻址则相当于指向某种数据类型的指针变量。(地址)三、寄存器相对寻址方式(变址寻址)三、寄存器相对寻址方式(变址寻
19、址)(BX)DISP8 (SI)(DI)(BP)DISP16有效地址有效地址=段寄存器为段寄存器为DS段寄存器为段寄存器为SS+又称变址寻址,是将一个基址或变址寄存器中的又称变址寻址,是将一个基址或变址寄存器中的值,与一个值,与一个8或或16位数据相加,其结果作为偏移地位数据相加,其结果作为偏移地址(有效地址)。相见书址(有效地址)。相见书85页举例页举例物理地址物理地址=(DS)*16+(BX)+DISP8(SI)、()、(DI)、)、DISP16类同。类同。物理地址物理地址=(SS)*16+(BP)+DISP16寄存器相对寻址的缺省段寄存器按下列规则处理:寄存器相对寻址的缺省段寄存器按下列
20、规则处理:*变量变量+寄存器寄存器形式,以变量对应的缺省段寄存器为准;形式,以变量对应的缺省段寄存器为准;*寄存器寄存器+数值数值形式,以寄存器对应的缺省段寄存器为准形式,以寄存器对应的缺省段寄存器为准;*不允许同时出现两个或两个以上的变量相加的情况不允许同时出现两个或两个以上的变量相加的情况;但可以出现两个定义在同一段中的变量相减,减但可以出现两个定义在同一段中的变量相减,减法表示两个变量偏移地址的差值,这个差值不再作变量法表示两个变量偏移地址的差值,这个差值不再作变量看待,此时缺省段寄存器则以基址或变址寄存器的缺省看待,此时缺省段寄存器则以基址或变址寄存器的缺省段寄存器为准。段寄存器为准。
21、逻辑地址中的段与偏移的对应关系是非常重要的,逻辑地址中的段与偏移的对应关系是非常重要的,如果搞错对应关系,就无法从内存正确的位置取出正确如果搞错对应关系,就无法从内存正确的位置取出正确的操作数,或将操作数放到内存中一个错误的位置,这的操作数,或将操作数放到内存中一个错误的位置,这种错误不是可以指出的语法错误,而属于逻辑错误,这种错误不是可以指出的语法错误,而属于逻辑错误,这个错误是很难查出的。个错误是很难查出的。寄存器相对寻址的寄存器相对寻址的主要用途主要用途是针对类似高级语言中定是针对类似高级语言中定义的数组,以一个通用寄存器放下标值实现对数组元素义的数组,以一个通用寄存器放下标值实现对数组
22、元素的直接访问。例如:在汇编语言中,设的直接访问。例如:在汇编语言中,设ARR是一个整型是一个整型数组变量,其中存放了数组变量,其中存放了10个字型带符号整数,用个字型带符号整数,用ARR+BX得形式可访问各元素,得形式可访问各元素,BX的取值分别为的取值分别为0,2,4,6,8,10,12,14,16,18;例:例:如果如果(DS)=3000H,(SI)=2000H,COUNT=3000H,执行指令执行指令 MOV AX,CONUTSI,求出此种寻址方式对应的有效地址和物理地址。求出此种寻址方式对应的有效地址和物理地址。有效地址有效地址=2000H+3000H=5000H物理地址物理地址=(
23、DS)*16+5000H =30000H+5000H=35000H例如:例如:MOV AX,COUNTBP若(若(SS)=5000H;(BP)=3000H;COUNT=2040H有效地址有效地址=3000H+2040H=5040H物理地址物理地址=50000H+5040H=55040H四基址加变址寻址:四基址加变址寻址:又称基址变址寻址,使用一个基址寄存器和一个变又称基址变址寻址,使用一个基址寄存器和一个变址寄存器的值相加,计算结果作为操作数的偏移地址。址寄存器的值相加,计算结果作为操作数的偏移地址。缺省时的对应关系是:当基址寄存器是缺省时的对应关系是:当基址寄存器是BX时,段时,段寄存器是寄
24、存器是DS;当基址寄存器是;当基址寄存器是BP时,段寄存器是时,段寄存器是SS;如果需要,基址变址寻址方式也可以使用段跨越。如果需要,基址变址寻址方式也可以使用段跨越。例如:例如:MOV AX,BXSI MOV AX,BX+SI 这种寻址方式同样适用于数组或表格处理,首地址这种寻址方式同样适用于数组或表格处理,首地址可存放在基址寄存器中,而用变址寄存器来访问数组可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器都可以修改,所以使中的各个元素。由于两个寄存器都可以修改,所以使用比较灵活。用比较灵活。(BX)(SI)(BP)(DI)有效地址有效地址=+物理地址物理地址=(D
25、S)*16 +(BX)+(SI)或()或(DI)物理地址物理地址=(SS)*16 +(BP)+(SI)或()或(DI)例:例:MOV AX,BX+DI 或或 MOV AX,BXDI DS:(BX)+(DI)字存储单元内容送字存储单元内容送AX。例:例:MOV AX,BP+SI 或或 MOV AX,BPSI SS:(BP)+(SI)字存储单元内容送字存储单元内容送AX。在高档机中,可用的寄存器更多,参见书在高档机中,可用的寄存器更多,参见书85页页 举举例例 例:如果例:如果(DS)=2100H,(BX)=0158H,(DI)=10A5H,EA=11FDH,执行指令执行指令 MOV AL,BXD
26、I有效地址:有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH 物理地址:(物理地址:(DS)*16+有效地址有效地址=21000H+11FDH=221FDH执行结果:将执行结果:将221FDH单元内容送入寄存器单元内容送入寄存器AL中。中。五五相对的基址加变址寻址:相对的基址加变址寻址:又称相对基址变址,操作数的有效地址,是在基又称相对基址变址,操作数的有效地址,是在基址变址的基础上再加上一个址变址的基础上再加上一个8位或位或16位的偏移量。位的偏移量。这种寻址方式用起来比较灵活,尤其是对堆栈数据这种寻址方式用起来比较灵活,尤其是对堆栈数据的访问提供了较大的方便。访问堆栈
27、数组时,将的访问提供了较大的方便。访问堆栈数组时,将BP指指向栈顶,位移量用来表示栈顶到数组首地址的距离,向栈顶,位移量用来表示栈顶到数组首地址的距离,变址寄存器变址寄存器DI(或或SI)用来指向数组中的某一个元素。用来指向数组中的某一个元素。例:已知:例:已知:(DS)=3000H,(,(BX)=2000H,(SI)=1000H,MK=0250H 指令:指令:MOV AX,MKBXSI 或或 MOV AX,MKBX+SI 或或 MOV AX,MK+BX+SI 有效地址:有效地址:MK+(BX)+(SI)=0250H+2000H+0100H =3250H 物理地址:(物理地址:(DS)*16+
28、有效地址有效地址=30000H+3250H=33250H 执行结果:将执行结果:将33250H单元内容送单元内容送AL,33251H内容送内容送AH。*比例变址寻址比例变址寻址 只出现在只出现在80386以上的机器中,以上的机器中,是指一对寄存器中的第二个比是指一对寄存器中的第二个比例因子用例因子用2,4,或,或8来乘,产生来乘,产生操作数的内存地址。见书操作数的内存地址。见书86页。页。5.3 80X86指令系统5.3.1 数据传送指令1通用数据传送指令 (1)MOV 指令指令 格式:MOV OPRD1,OPRD2功能:将字节或字从源传送到目的地。(2)PUSH 指令指令格式:PUSH OP
29、RD功能:将字压入堆栈。(3)POP 指令指令格式:POP OPRD功能:将字从堆栈弹出到目的操作数。PUSE 指令 执行的操作:先将(SP)2,然后将操作数指明的字型数据放入以SS为段地址,SP为偏移地址所对应的内存单元中去,包括移动栈顶和存入数据两部分,两部分连续完成,密不可分。POP 指令 执行的操作:从以SS为段地址,SP为偏移地址对应的内存中取出一个字型数据,送到操作数指定的位置,然后(SP)+2。举例:设 AX=4F8AH,BX=307CH,SP=1000H;分别执行下列指令,用内存图的形式画出堆栈的变化,并分析程序段执行后AX和BX寄存器的值。PUSH AX PUSH BX PO
30、P AX POP BX X XX XY YX X X X0FFC0FFD0FFE0FFF1000SPX XX X8 A4 FY YSP7 C3 08 A4 F Y YSP X XX X8 A4 FY YSPX XX XX XX X Y YSP 执行前 PUSH AX 后 PUSH BX 后 POP BX 后 POP AX后注:XX表示栈空闲区填充的无用数据,YY表示栈中已存放的有效数据.AX=(),BX=()(4)XCHG 指令指令格式:XCHG OPRD1,OPRD2功能:可在源,目的操作数之间交换一个字节或字的数据 可在寄存器与寄存器之间,或寄存器与存储器之间交换,但不允许使用段寄存器。(
31、5)XLAT 指令指令格式:XLAT OPRD 或 XLAT 功能:这是一条隐含操作数指令,将BX寄存器内容加上AL寄存器内容作为操作数的偏移地址,从这个地址取一字节内容送入AL寄存器。该指令的功能概括地说就是“查表转换”。在内存中预先放置一张表,每个表项由一个字节构成,最多不超过256字节。将表的起始偏移地址放在BX中,要想取出表的第N项,可以先将N放到AL中,然后用该指令取出指定表项放在AL中。2输入/输出数据传送指令可分为两大类:直接输入/输出指令;间接输入/输出指令;1)输入指令 (1)直接输入指令)直接输入指令 IN 格式:IN 累加器,端口地址 功能:将数据从输入端口传送到累加器。
32、例如:IN AL,PORT ;将PORT端口的字节内容 AL (2)间接输入指令间接输入指令:将外设地址放在DX寄存器中,类似寄存器间接寻址,但不需加括号,当外设地址大于255时,必须放在寄存器DX中,小于或等于255时,两种寻址方式都有效。例如:IN AL,DX;从DX所指的端口中读取一个字节。2)输出指令 (1)直接输出指令)直接输出指令 OUT 格式:OUT 端口地址,累加器 功能:将数据从累加器传送到输出端口中。例如:OUT PORT,AL ;将AL的内容送入PORT端口 (2)间接输出指令)间接输出指令 执行指令时,端口地址已传送到DX寄存器中。其它规定和输入指令相同。详见书中例子输
33、入/输出指令在接口设计中用的较多。3、地址传送指令、地址传送指令(1)LEA指令指令 格式:格式:LEA OPRD1,OPRD2 功能:取有效地址,原操作数必须是一个内存单元地功能:取有效地址,原操作数必须是一个内存单元地址,目的操作数必须是址,目的操作数必须是16位的通用寄存器,此指令将原位的通用寄存器,此指令将原操作数的地址偏移量送入目的操作数。操作数的地址偏移量送入目的操作数。例如:例如:LEA DI,ADDR ;将将ADDR地址偏移量送入地址偏移量送入DI LEA BX,BP+SI ;指令执行后,指令执行后,BX中的内容中的内容 为为BP+SI的值的值(2)LDS指令指令 格式:格式:
34、LDS OPRD1,OPRD2 功能:完成一个地址指针的传送。地址指针包括段功能:完成一个地址指针的传送。地址指针包括段地址部分和偏移量部分。指令将段地址送入地址部分和偏移量部分。指令将段地址送入DS,将偏将偏移量送入一个移量送入一个16位的指针寄存器或变址寄存器中。位的指针寄存器或变址寄存器中。例如:例如:LDS SI,BX ;将将BX指向的指向的32位地址指针位地址指针 的高的高16位送入位送入DS,低低16位(偏移量)送入位(偏移量)送入SI.(3)LES指令指令 格式:格式:LES OPRD1,OPRD2 功能:同功能:同LDS,区别在将段地址传送给区别在将段地址传送给ES.例如:例如
35、:LES DI,BX+BUF ;请加注释请加注释地址传送指令的操作功能(1)LEA 指令 格式:LEA REG,OPRD 功能:有效地址送寄存器指令 执行的操作:OPRD (REG)(2)LDS 指令 格式:LDS REG,OPRD 功能:指针送寄存器和DS指令 执行的操作:(OPRD)(REG)(OPRD+2)(DS)(3)LES 指令 格式:LES REG,OPRD 功能:指针送寄存器和ES指令 执行的操作:(OPRD)(REG)(OPRD+2)(ES)以上三条指令指定的寄存器不能使用段寄存器,以上三条指令指定的寄存器不能使用段寄存器,且源操作数必须使用除立即数及寄存器方式以外的其且源操作
36、数必须使用除立即数及寄存器方式以外的其他寻址方式。他寻址方式。本组指令把变量的偏移地址(本组指令把变量的偏移地址(LEA)或段地址和)或段地址和偏移地址(偏移地址(LDS和和LES)送给寄存器,以提供访问变)送给寄存器,以提供访问变量的工具。量的工具。4.状态标志位传送指令状态标志位传送指令 (1)LAHF 指令将标志寄存器的低指令将标志寄存器的低8位送入位送入AH (2)SAHF 指令将指令将AH寄存器内容送入标志寄存器寄存器内容送入标志寄存器 的低的低8位。位。(3)PUSHF 指令将指令将16位标志寄存器内容压栈。位标志寄存器内容压栈。(4)POPF 指令将当前栈顶内容弹出至标志寄存器。
37、指令将当前栈顶内容弹出至标志寄存器。5.3.2 算术运算指令算术运算指令1.加法加法 一般形式:ADD oprd1,oprd2;oprd1=oprd1+oprd2 ADC oprd1,oprd2;oprd1=oprd1+oprd2+CF INCoprd;oprd=oprd+1 语法格式:ADD reg/mem,reg/mem/immADC reg/mem,reg/mem/immINCreg/mem 对标志位的影响:ADD、ADC:按一般规则影响CF、OF、SF和ZF。INC:不影响CF,其它同ADD。说明:说明:ADD与与ADC的的2个操作数必须个操作数必须类型匹配类型匹配,且不,且不能同时是
38、内存操作数。能同时是内存操作数。其他加法指令其他加法指令*AAA 非压缩BCD码加法调整指令执行的操作:将AL中的和调整到非压缩的BCD格式 (AL)(AH)+调整产生的进位和 (AH)这条指令之前必须执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并将结果存放在AL寄存器中。具体调整过程如下:(1)AL的低4位为0H-9H之间,且标志AF为“0,执行(3)(2)AL的低4位为AH-FH之间,或标志AF=1,则(AL)+06 (AL);(AH)+1 (AH);AF置“1”(3)AL寄存器的高4位被清除;(4)将 AF 的值送 CF 标志位;举例:(AX)=0008H,(BL)=
39、09H;执行下列指令 ADD AL,BL;(AL)=11H,(BL)=09H;AF=1 AAA ;(AL)=07H,(AH)=01H 或(AX)=0107H,CF=1*DAA 加法的十进制调整指令执行的操作:把AL中的和调整到压缩的BCD格式 (AL),这条指令之前必须执行ADD或ADC指令。具体操作如下:(1)AF=1或AL寄存器的低4位为AH-FH时,(AL)+06H,并将标志AF置“1”(调整低4位)。(2)CF=1或(AL)的高4位为AH-FH时,(AL)+60H,并将标志CF置“1”(调整高4位)。例如:当(AL)=26H,(CL)=26H;分析以下指令的执行情况:ADD AL,CL
40、;(AL)=4CH,CF=0,AF=0 DAA ;(AL)=52H,CF=0,AF=1 可以看到DAA指令是将(AL)+06 (AL),使得(AL)=52,使结果调整为正确的BCD码,并将标志AF置1。2减法指令(1)SUB 指令 格式:SUB OPRD1,OPRD2 功能:完成两个操作数相减,结果放在目的操作数中。详见书中实例(2)SBB 指令 格式:SBB OPRD1,OPRD2功能:与SUB基本相同,区别在于在两个操作数相减时,还要减去借位标志CF的当前值。(3)DEC 指令 格式:DEC OPRD功能:完成对操作数OPRD减1运算后返回操作数中,操作数可以是寄存器或存储器。(4)NEG
41、 指令格式:NEG OPRD功能:完成对操作数取补,即用零减去操作数,再将结果送回操作数。详见书中例子(5)CMP 指令格式:CMP OPRD1,OPRD2功能:完成两个操作数相减,但不回送结果,结果只影响标志状态。详见书中讲解。(6)其他减法指令 AAS 非压缩BCD码减法调整指令格式:AAS功能:将AL中的差调整为非压缩的BCD码,AAS指令用在SUB,SBB指令之后。调整过程如下:(1)AL寄存器的低4位为0H-9H时,且标志AF=0则执行(3)(2)AL的低4位为AH-FH时,或标志AF=1,(AL)-06H (AL),(AH)-1 (AH),AF置1;(3)AL寄存器的高4位被清除。
42、(4)将AF的值送CF标志位。*DAS 压缩BCD码减法调整指令格式:DAS功能:将AL寄存器中的差调整为压缩的BCD码具体操作:(1)当AF=1或者AF的低4位为AH-FH时,AL寄存器的内容减去06H,并将标志AF置“1”。(2)当CF=1或者AL寄存器的高4位为AH-FH时,AL寄存器内容减去60H,并将标志CF置“1”。3。乘法指令(1)MUL 无符号数乘法指令格式:MUL OPRD功能:完成两个无符号数的乘法运算。要求被乘数放在AL或者AX寄存器中,用于字节运算和字运算,另一乘数可通过指令中的OPRD(除立即数寻址方式以外)获得。(不允许为立即数)详见书中例子(2)IMUL 带符号数
43、乘法指令格式:IMUL OPRD功能:完成两个带符号数的乘法运算,其操作数与结果的存放方式与MUL指令相同,如果为负数时,则用补码表示,其结果也用补码表示。(3)AAM 非压缩BCD码乘法调整指令格式:AAM功能:将存放在AX中的积调整为非压缩的BCD码。该指令用在MUL指令对两个非压缩BCD码的数进行乘法之后。其调整方法是将AL寄存器中的内容除以0AH,商放在AH寄存器中,余数放在AL寄存器中。例如:(AL)=08H,(BL)=08H 执行下列指令 MOV AL,08H MUL BL ;(AX)=0080H AAM ;(AH)=06H,(AL)=04H通过上例,可以看出十进制调整指令使结果为
44、一个BCD码。4、除法指令(1)DIV 无符号除法指令 格式:DIV OPRD 功能:完成两个无符号数的除法运算,分为字和字节操作。字节操作时,被除数放在AX中,8位除数由指令给出,结果商放在AL中,余数放在AH中。字操作时,被除数放在DX,AX中,16位除数由指令给出,结果商放在AX中,余数放在DX中。(2)IDIV格式:IDIV OPRD功能:完成两个带符号数的除法操作。执行该指令时,要求操作数为带符号数,商及余数也为带符号数,规定余数与被除数符号相同。(3)AAD 非压缩BCD码除法调整指令格式:AAD功能:将AX寄存器中非压缩的BCD码形式的被除数调整为二进制数,并存放在AL中。用于D
45、IV指令之前。具体执行的操作:10*(AH)+(AL)(AL)(AH)=0 ;AH清为清为0(4)CBW 字节转换为字(字节型符号扩展)格式:CBW功能:对AL中的带符号数进行符号扩展该指令一般与IDIV指令配合使用。(5)CWD 字转换为双字(字形符号扩展)格式:CWD功能:对AX中的带符号数进行扩展到DX中。该指令一般与IDIV指令配合使用。在除法字节操作中要求被除数为在除法字节操作中要求被除数为16位,字操作中被除数为位,字操作中被除数为32位。位。5.3 逻辑运算和移位指令1逻辑运算指令 (参见书93-94页举例)(1)NOT 指令格式:NOT OPRD功能:对操作数按位取反,结果送回
46、原处。例如:MOV AL,12H NOT AL(2)AND 指令格式:AND OPRD1,OPRD2功能:对两个操作数按位“与”运算,结果放回目的操作数。(3)OR 指令格式:OR OPRD1,OPRD2功能:对两个操作数按位“或”运算,结果送回目的操作数。(4)XOR 指令格式:XOR OPRD1,OPRD2功能:对俩操作数进行按位“异或”运算,结果送回目的操作数。(5)TEST 指令格式:TEST OPRD1,OPRD2功能:该指令的操作和AND指令完全相同,但结果不回送。逻辑运算指令对标志位的影响详见书中的说明及逻辑运算指令对标志位的影响详见书中的说明及实例实例。2、移位指令(1)SAL
47、/SHL (算术左移/逻辑左移)格式:SAL/SHL OPRD,mCF0(2)SAR 算术右移指令 格式:SAR OPRD,mCF其中:OPRD可以是除立即数以外的任何寻址方式,移位次数由m决定,为1时可用立即数,如果大于1则可在移位指令前将移位次数送到CL寄存器中。(3)SHR 逻辑右移指令格式:SHR OPRD,mCF0(4)循环移位指令CFCFCFCF 循环左移 循环右移 带进位循环左移 带进位循环右移5.3.4 串操作指令串操作指令 串可以是字节串或字串。串指令有两类:串操作指串操作指命令,控制操作重复执行的前缀命令。命令,控制操作重复执行的前缀命令。串操作时,下列寄存器及标志位起着特
48、定作用,程序应根据操作的具体要求赋予初值。SI 寄存器 源串变址用 DI 寄存器 目的串变址用 CX 寄存器 重复次数寄存器 AL/AX 寄存器 扫描值(关键字)标志寄存器中:DF 0 表示重复操作中DI,SI应自动增量;1 表示自动减量。ZF 用于控制扫描或比较操作结果。1、基本串操作指令(1)MOVS 串传送指令格式:MOVS OPRD1,OPRD2执行的操作:1)(DI)(SI)2)字节操作 当DF=0,(SI)(SI)+1,(DI)(DI)+1 当DF=1,(SI)(SI)-1,(DI)(DI)-13)字操作 当DF=0,(SI)(SI)+2,(DI)(DI)+2 当DF=1,(SI)
49、(SI)-2,(DI)(DI)-2 在使用MOVS指令之前,必须将源,目的操作数的偏移地址分别送SI,DI;并设置DF.(2)MOVSB/MOVSW 串传送指令格式:MOVSB/MOVSW本条指令明确了字或字节传送,功能和MOVS相同。(3)CMPS 串比较指令格式:CMPS OPRD1,OPDR2执行的操作:1)(SI)(DI)2)字节操作 当DF=0,(SI)(SI)+1,(DI)(DI)+1 当DF=1,(SI)(SI)-1,(DI)(DI)-13)字操作 当DF=0,(SI)(SI)+2,(DI)(DI)+2 当DF=1,(SI)(SI)-2,(DI)(DI)-2不断修改两个操作数的地
50、址,作相减运算,但不保存结果,只是根据结果设置条件码。(4)CMPSB/CMPSW 字节串/字串比较指令和CMPS指令功能相同,只是具体指出了操作数类型。(5)LODS 从串取指令格式:LODS OPRD LODSB LODSW执行的操作:字节操作:(AL)(SI),根据DF的取值,SI作 加1或减1修改。字操作:(AX)(SI),根据DF的取值,SI作加2或减2的修改。(6)SCAS 串扫描指令格式:SCAS OPRD SCASB SCASW执行的操作:字节操作:(AL)(DI),根据DF的值DI作加1或减1操作。字操作:(AX)(DI),根据DF的值DI作加2或减2操作。(7)STOS 存