8086指令系统总结学习微处理器及其程序设计,必须掌握微处理器的指令系统。
本章以8086 微处理器为例介绍微型计算机的指令系统,包括指令格式、寻址方式和各类指令功能。
要明确各种寻址方式的区别和特点,掌握有效地址和物理地址的计算方法,要正确使用指令,掌握各类指令的功能、对标志位的影响和使用上的一些特殊限制。
能够编写小汇编程序,初步掌握汇编程序的编写和调试方法。
本章的重点难点内容是:8086 的指令格式及寻址方式,8086 的常用指令和8086 指令前缀的使用。
下面我们分别进行总结:一.8086寻址方式(1)操作数是数字,指令中立即写出数字------------立即数寻址MOV AX,1234H 解释此句意义(2)操作数是寄存器内容,指令中写出寄存器的符号---------寄存器寻址MOV AX,BX(3)操作数是存储单元内容,用括号括出存储单元有效地址-----直接寻址MOV AX,[1234H]MOV AX,ES:[1234H](4)操作数是存储单元内容,用括号括出寄存器或其表达式,寄存器或其表达式的值为存储单元有效地址-------------间接寻址MOV AH,[BX]MOV AX,ES:[SI]MOV AL,[BX+SI+5]===5[BX+SI]===5[BX][SI]二.8086指令系统1.数据传送指令(一)通用传送指令(1)MOV指令指令格式:MOV 目,源功能:将源操作数传送给目标操作数。
(2)堆栈操作指令进栈指令:PUSH格式:PUSH 源功能:将源操作数压入堆栈。
例:用堆栈指令完成上例的功能。
MOV AX,3000HMOV DS,AX ;段寄存器填充MOV SI,0100H ;基本指令执MOV DI,2000H ;行前的初值MOV CX,50NT: PUSH [SI] ;程序从这POP [DI] ;开始设计INC SIINC SIINC DIINC DILOOP NTMOV AH,4CHINT 21H(3)交换指令XCHG格式:XCHG 目,源功能:源和目标中的内容交换。
(二)累加器专用传送指令(1)输入输出指令IN,OUT输入指令格式:#1 IN AX|AL,8位端口号#2 IN AX|AL,DX功能:从外设输入数据到AX|AL寄存器。
输出指令格式:#1 OUT 8位端口号,AX|AL#2 OUT DX,AX|AL功能:将AX|AL中的数据输出到外设。
该类指令是硬件功能与软件作用的结合。
(2)查表转换指令XLAT指令格式:XLAT功能:将内存单元[BX+AL]中的内容,置入AL寄存器中。
(三)地址传送指令地址传送指令有两类:仅传送偏移地址指令及段地址与偏移地址同时传送指令。
(1)仅传送偏移地址指令:LEA指令格式:LEA 目,源功能:将源操作数的偏移地址传送给目标寄存器。
如:LEA BX,[2000H]执行后BX=2000H。
又如:LEA SI,[BX+100H]若执行前BX=1000H,执行后SI=1100H。
(2)段地址与偏移地址同时传送指令:LDS、LES指令格式:LDS 目,源LES 目,源功能:将源存储器操作数连续4个字节的内容传送给目标寄存器DS寄存器(LDS指令)或ES寄存器(LES指令)。
如:LDS BX,[2000H]执行前[2000H]=1234H;[2002H]=5678H。
执行后BX=1234H;DS=5678H又如:LDS SI,[BX+100H]若执行前BX=1000H,而[1100H]=4321H;[1102]=8765H。
执行后SI=4321H;DS=8765H。
(四)标志传送指令(1)LAHF指令指令格式:LAHF指令功能:将标致寄存器的低八位中以定义位,传送给AH寄存器中对应的位。
(2)SAHF指令指令格式:SAHF指令功能:将AH寄存器中对应的位,传送给标致寄存器的低八位中以定义位。
(3)PUSHF指令指令格式:PUSHF指令功能:将标致寄存器内容进栈。
(4)POPF指令指令格式:POPF指令功能:从栈顶弹出一个字送入标致寄存器。
2.算术运算(一)加法指令加法指令有三类:不带进位加法指令、带进位加法指令和增一指令。
它们均适合与无符号数和有符号数的加法。
对于有符号数,其结果用补码表示。
(1)不带进位的加法指令ADD指令格式:ADD 目,源指令功能:源+目,其结果放到目标,并影响标志寄存器。
如:ADD AL,50H ;(AL)+50H→AL(2)带进位的加法指令ADC指令格式:ADC 目,源指令功能:源+目+CF,其结果放到目标,并影响标志寄存器。
利用ADC指令可以实现两个多字节数的相加运算。
如:1244AFDCH+9A12458FH。
如:ADC AL,50H ;(AL)+50H+CF→AL(3)增一指令INC指令格式:INC 目指令功能:目+1,其结果放到目标,并影响标志寄存器。
(二)减法指令减法指令包含有五类:不考虑借位减法指令、考虑借位减法指令、减一指令、求补指令和比较指令。
它们均适合与无符号数和有符号数的减法。
对于有符号数,其结果用补码表示。
(1)不考虑借位减法指令SUB指令格式:SUB 目,源指令功能:目-源,其结果放到目标,并影响标志寄存器。
(2)考虑借位减法指令SBB指令格式:SBB 目,源指令功能:目-源-CF,其结果放到目标,并影响标志寄存器。
利用SBB指令可以实现两个多字节数的相减运算。
如:1244AFDCH-9A12458FH。
(3)减一指令DEC指令格式:DEC 目指令功能:目-1,其结果放到目标,并影响标志寄存器。
(4)求补指令NEG指令格式:NEG 目指令功能:0-目,其结果放到目标,并影响标志寄存器。
(5)比较指令CMP指令格式:CMP 目,源指令功能:目-源,其结果不放到目标,但设置标志寄存器。
用法:#1 对于两个无符号数的比较,根据CF标志判断两数的大小。
#2 对于两个有符号数比较大小,根据SF和OF标志位来判断两数的大小:OF和SF相同(=0或=1)则目>源;如果OF和SF相异,则源>目。
(三)乘法指令乘法指令有两类:无符号数乘法指令和有符号数乘法指令。
(1)无符号乘法指令MUL指令格式:MUL 源指令功能:(AL|AX)*源,其结果放到AX|DX:AX(2)有符号乘法指令IMUL指令格式:IMUL 源指令功能:(AL|AX)*源,其结果放到AX|DX:AX(四)除法指令8086CPU的除法指令有两类:无符号数除法指令和有符号数除法指令。
它们均是不等长除法指令。
即:被除数长度必须是除数长度的两倍。
所以,在进行除法运算前应根据除数长度将被除数变成它的两倍长度。
(1)无符号数除法指令DIV指令格式:DIV 源指令功能:AX|DX:AX/源,其结果:商放在AL|AX,余数放在AH|DX之中。
(2)有符号数除法指令IDIV指令格式:IDIV 源指令功能:AX|DX:AX/源,其结果:商放在AL|AX,余数放在AH|DX之中。
(3)将字节扩展成字的指令CBW指令格式:CBW指令功能:将AL中有符号数的符号位扩展到AH之中。
不影响标志位。
用法:一般在两字节有符号数除法前,利用该指令,将符号位进行扩展,以使两数变成不等长数。
(4)将字扩展成双字的指令CWD指令格式:CWD指令功能:将AH中有符号数的符号位扩展到DX之中。
不影响标志位。
用法:一般在执行两字长有符号数除法前,利用该指令,将符号位进行扩展,以使两数变成不等长数。
(五)BCD码运算指令BCD码有两类:组合(压缩)型BCD码和未组合(非压缩)型BCD码。
BCD码的运算相应也有两种情况。
(1)未组合BCD码加法十进制调整指令AAA指令格式:AAA指令功能:对AL中的数进行校正:在AX中产生未组合十进制数和。
如: MOV AL,7ADD AL,5AAA执行前两条后,AL=0CH,经AAA调整后,AX=0102H,CF=OF=1。
(2)组合BCD码加法十进制调整指令DAA指令格式:DAA指令功能:对AL中的数进行校正:在AL中产生组合十进制数和。
如: MOV AL,56H(BCD)ADD AL,47H(BCD)DAA执行前两条后,AL=9DH,经DAA调整后,AL=03H,CF=1。
例:多字节组合BCD码十进制相加设两数长度均为8个字节,分别存放在1000H和2000H开始的8个单元中,要求将两数相加后,结果放在2000H开始的内存区域。
MOV SI,1000HMOV DI,2000HMOV CX,8CLCL1:MOV AL,[SI]ADC AL,[DI]DAAMOV [DI], ALINC SIINC DILOOP L1MOV AH,4CHINT 21H(3)未组合BCD码减法十进制调整指令AAS指令格式:AAS指令功能:对AL中的数进行校正:在AX中产生未组合十进制数差。
如: MOV AL,"7" ;"7"为7的ASCII码SUB AL,5AAS执行前两条后,AL=32H,经AAS调整后,AL=02H。
(4)组合BCD码加减十进制调整指令DAS指令格式:DAS指令功能:对AL中的数进行校正:在AL中产生组合十进制数差。
如: MOV AL,56H(BCD)SUB AL,47H(BCD)DAS执行前两条后,AL=0FH,经DAS调整后,AL=09H,CF=1。
(5)未组合BCD码的乘法十进制调整指令AAM指令格式:AAM指令功能:对AL中的数进行校正:在AX中产生未组合十进制数积。
如: MOV AL,05H(BCD)MOV BL,06H(BCD)MUL BLAAM执行前三条后,AX=001EH,经AAM调整后,AX=0300H (BCD)。
(6)未组合BCD码的除法十进制调整指令AAD指令格式:AAD指令功能:对AX中的数进行校正:在AX中产生未组合十进制数。
如: MOV AX,0300H(BCD)AADMOV BL,06H(BCD)DIV BL执行前两条后,AX=001EH,执行DIV指令后,AX=0005H (BCD)。
3.逻辑运算逻辑指令有三类:逻辑运算指令:NOT、AND、OR、XOR及TEST移位指令:SHL、SAL、SHR和SHR循环移位指令:ROL、ROR、RCL和RCR1. 逻辑运算指令(1)求反指令NOT指令格式: NOT 目指令功能:将目标内容求反。
(2)逻辑与指令AND指令格式: AND 目,源指令功能:将目标内容同源内容按位进行逻辑与运算。
结果放在目标。
如:AND AX,00FFH其结果AH=0(被屛蔽);AL内容不变。
(3)逻辑或指令OR指令格式: OR 目,源指令功能:将目标内容同源内容按位进行逻辑或运算。
结果放在目标。
如:OR AX,00FFH其结果AH内容不变;AL=0FFH(所有位为1)。