1、第二节第二节 8086/8088的指令系统的指令系统8086/8088的指令系统中共有的指令系统中共有92种基本指令。种基本指令。可以分成可以分成6个功能组个功能组:1数据传送数据传送(Data transfer)2算术运算(算术运算(Arithmetic)3逻辑运算和移位指令逻辑运算和移位指令(Logic& Shift)4串操作串操作(String manipulation)5控制转移(控制转移(Control Transfer)6处理器控制(处理器控制(Processor Control)介绍指令系统使用介绍指令系统使用的符号:的符号:八位寄存器八位寄存器: AH,AL,BH,H,BL,C
2、H,CL,DH,DL 十六位通用寄存器十六位通用寄存器: AX,BX,CX,DX,SP,BP,SI,DI 堆栈指针堆栈指针 SP 指令指针指令指针 IP标志位标志位Flags目的和源变址寄存器目的和源变址寄存器DI, SI段寄存器段寄存器CS, DS, ES, SS通用寄存器通用寄存器rAL或或AX(取决于操作数长度取决于操作数长度) accsrc , dest源,目的操作数(下列寻址方式都可以用)源,目的操作数(下列寻址方式都可以用) BX+SI+n,BX+DI+n,BP+SI+n,BP+DI+nSI+n,DI+n, BP+n, BX+nN,r 存储器单元的内容存储器单元的内容(正常在数据段
3、正常在数据段)ES: 附加数据段的内容附加数据段的内容 OPRD 操作数操作数Seg 段寄存器(段寄存器(CS,DS,ES,SS)i m 立即数立即数 (n 8位位, nn 16位位, nnnn 32位位 )8086/8088指令助记符表指令助记符表指令类别指令类别记助符记助符数数据据传传送送通用传送通用传送输入输出输入输出目标地址传送目标地址传送标志传送标志传送算算术术运运算算加法加法减法减法乘法乘法除法除法转换转换MOV, PUSH, POP, XCHG, XLATMOV, PUSH, POP, XCHG, XLATIN, OUTIN, OUTLEA, LDS, LESLEA, LDS,
4、LESLAHF, SAHF, PUSHF, POPFLAHF, SAHF, PUSHF, POPFADD, ADC, INC,ADD, ADC, INC, AAA, DAAAAA, DAASUB, SBB, DEC, NEG, CMP, SUB, SBB, DEC, NEG, CMP, AAS, DAS,AAS, DAS,MUL, IMUL, MUL, IMUL, AAMAAMDIV, IDIV, DIV, IDIV, AADAADCBW, CWDCBW, CWD8086/8088指令助记符表(续)指令助记符表(续)逻逻辑辑指指令令逻辑运算逻辑运算移位移位 循环移位 循环移位串串处处理理串操作
5、串操作重复控制重复控制控控制制转转移移转转移移无条件转移无条件转移条件条件转移转移循环控制循环控制过程调用过程调用中断指令中断指令处理器控制处理器控制AND, OR, XOR, NOT ,TESTAND, OR, XOR, NOT ,TESTSHL, SAL, SHR, SARSHL, SAL, SHR, SARROL, ROR, RCL, RCRROL, ROR, RCL, RCRMOVS, CMPS, SCAS, LODS, STOSMOVS, CMPS, SCAS, LODS, STOSREP, REPE/REPZ, REPNE/REPNZREP, REPE/REPZ, REPNE/RE
6、PNZJMPJMPJA/JNBE,JAE/JNB,JB/JNAE,JBE/JNA,JC,JCXZ,JE/JZ,JNS,JO,JS, JG/JA/JNBE,JAE/JNB,JB/JNAE,JBE/JNA,JC,JCXZ,JE/JZ,JNS,JO,JS, JG/JNLE,JGE/JNL,JL/JNGE,JLE/JNG,JNC,JNE/JNZ,JNO,JNP/JPO,JP/JPEJNLE,JGE/JNL,JL/JNGE,JLE/JNG,JNC,JNE/JNZ,JNO,JNP/JPO,JP/JPELOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZLOOP, LOOPE/LOOPZ, LO
7、OPNE/LOOPNZCALL, RETCALL, RETINT, INTO, IRETINT, INTO, IRETCLC, STC, CMC, CLD, STD, CLI, STI, NOP, HLT, WAIT, ESC,LOCKCLC, STC, CMC, CLD, STD, CLI, STI, NOP, HLT, WAIT, ESC,LOCK指令类别指令类别记助符记助符一、一、 数据传送指令数据传送指令(Data transfer)(一)通用传送指令(一)通用传送指令(General Purpose Transfer)(二)输入输出指令(二)输入输出指令(Input and Outp
8、ut)(三)目的地址传送指令(三)目的地址传送指令(Address-object transfer)(四)标志传送指令(四)标志传送指令(Flag register transfer)功能:功能: 负责负责CPU和存储器和存储器 CPU和和I/O端口端口 CPU的内部寄存器之间的数据传的内部寄存器之间的数据传 送。送。特点:特点: 它是计算机最基本、最重要的一种操作,使用比例最高。它是计算机最基本、最重要的一种操作,使用比例最高。 除除 SAHF和和POPF指令外,对标志位没有影响。指令外,对标志位没有影响。(General Purpose Transfer)8088提供方便灵活的通用的传送操
9、作,适用于大多数操作数。提供方便灵活的通用的传送操作,适用于大多数操作数。通用传送指令包括:通用传送指令包括:1、MOV (Movement)2、PUSH (Push word onto stack) POP (Pop word off stack)3、XCHG (Exchange)1MOV dest,src ; (dest) (src) 目的目的源源目的目的 源源 把一个字节把一个字节(B)或一个字(或一个字(W)操作数由源传送至目的。)操作数由源传送至目的。 实现实现:寄存器寄存器 寄存器寄存器/存储器之间;存储器之间;立即数立即数寄存器寄存器/存储器存储器寄存器寄存器/存储器存储器段寄存
10、器之间的数据传送。段寄存器之间的数据传送。 具体说,通用数据传送指令能实现:具体说,通用数据传送指令能实现: CPU内部寄存器之间的数据的任意传送内部寄存器之间的数据的任意传送(除了代码段寄存器(除了代码段寄存器CS和指令指针和指令指针IP以外)。以外)。例:例: MOV DL,CH ; 8位寄存器位寄存器 8位寄存器位寄存器 MOV AX,DX ; 16位寄存器位寄存器 16位寄存器位寄存器 MOV SI, BP MOV DS,BX ;通用寄存器;通用寄存器 段段寄存器寄存器 MOV AX, CS ;段段寄存器寄存器 通用寄存器通用寄存器立即数传送至立即数传送至CPU内部通用寄存器组内部通用
11、寄存器组 (AX、BX、CX、DX、BP、SP、SI、DI)。)。 用于给寄存器赋初值。用于给寄存器赋初值。 例:例: MOV CL,04H;立即数;立即数8位位寄存器寄存器 MOV AX,03FFH;立即数;立即数16位位寄存器寄存器 MOV WORD PTR SI ,057BH ;立即数;立即数存储器存储器MOV BYTE PTR MEM, 5 ;立即数;立即数存储器存储器CPU内部寄存器(除内部寄存器(除CS和和IP外)外)与存储器(所有寻址方式)之间数据传与存储器(所有寻址方式)之间数据传送。送。 例:例:MOV MEM , AX; 累加器累加器存储器存储器,直接寻址直接寻址MOV M
12、EM ,DS;段寄存器;段寄存器存储器,存储器,直接寻址直接寻址MOV DISPBX ,CX;寄存器;寄存器存储器,存储器,变址寻址变址寻址MOV AX , DISP SI;存储器;存储器累加器,累加器,变址寻址变址寻址MOV DS , MEM;存储器;存储器段寄存器,段寄存器,直接寻址直接寻址MOV CX , DISP BX SI ;存储器;存储器累加器,累加器,相对基址加变址相对基址加变址 j MOV MEM2 , MEM1 错。错。MOV AX , MEM1MOV MEM2 , AX 对。对。 例例 : MOV DS,2000H 错。错。MOV AX, 2000HMOV DS , AX
13、对。对。 l MOV ES , DS ; 错错MOV AX , DSMOV ES , AX ; 对对 。 例:例:MOV CS,AX ; 错错 MOV AX,CS ;对对 。 MOV IP, AX ;错错 MOV AX, IP ; 对。对。BX、SI、DI间址间址默认段地址为默认段地址为DS,BP间址间址默认段地址默认段地址SS。这样做为了允许程序员连续用两条指令分别对这样做为了允许程序员连续用两条指令分别对SS和和SP寄寄存器赋值,同时又防止堆栈空间变动过程出现中断。存器赋值,同时又防止堆栈空间变动过程出现中断。(除(除SAHF、POPF以外)。以外)。 例:例:实现将实现将AREA1开始的
14、开始的100个数据传送到个数据传送到AREA2开始的单元。开始的单元。AREA1:AREA2:100个数据个数据分析题意:分析题意: 可以用可以用200条条MOV指令来完成指令来完成100个数据传送,个数据传送, 指令操作重复,每个数据传送后的地址是变化的。指令操作重复,每个数据传送后的地址是变化的。 可以利用循环,可以利用循环,但每循环一次要修改地址(源地址和目的地址),但每循环一次要修改地址(源地址和目的地址),必须把地址放在寄存器当中,用必须把地址放在寄存器当中,用寄存器间接寻址来寻找操作数寄存器间接寻址来寻找操作数.得到如下程序:得到如下程序:MOV SI, AREA1 MOV DI,
15、 AREA2 MOV CX,100AGAIN :MOV AL,SIMOV DI,AL JNZ AGAIN2 PUSH (Push word onto stack) POP (Pop word off stack) 这是两条堆栈操作指令。这是两条堆栈操作指令。什么是堆栈? 按“后进先出(LIFO)”方式工作的存储区域。堆栈以字为单位以字为单位进行压入弹出操作。堆栈操作是如何进行的?为什么要设置堆栈?为什么要按 “后进先出”方式工作?规定由SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。 SPSS堆栈段堆栈段进栈方向退栈方向栈底栈底栈
16、顶栈顶 压栈指令 PUSH src ; src为16位操作数 例:PUSH AX;将AX内容压栈 执行操作:SP-1高字节AH SP-2低字节AL SPSP- 2设AX=1020H,执行示意图如图低地址存储区(SS段)执行前AX=1020HSP=2006H(SP)存储区(SS段)进栈方向执行后SP=2004H2010(AL)(AH)PUSH AX指令执行示意图指令执行示意图SP-2SP高地址低地址高地址SP- -1压栈指令的格式为: PUSH reg PUSH mem/reg PUSH segreg例如: PUSH AX PUSH BX PUSH DS 注意进栈方向是高地址向低地址发展。 弹出
17、指令 POPdest例:POPBX;将栈顶内容弹至BX 执行操作: BL(SP) BH(SP)+1 SPSP+2POP BX 的执行示意图如下图所示低地址存储区(SS段)出栈方向执行前SP=2006H2010POP BX指令执行示意图指令执行示意图(SP)存储区(SS段)执行后(BX)=1020SP=2008H(SP)(SP)+1(SP)+2BX2010高地址低地址高地址q 暂时保存暂时保存 调用子程序(或过程)或发生中断时要调用子程序(或过程)或发生中断时要保护断点的地址保护断点的地址, 子程序或中断返回时恢复断点。子程序或中断返回时恢复断点。主程序IP继续执行主程序执行子程序转子程序压栈弹
18、出返回主程序主程序IPIP(下)继续执行主程序转子程序1返回主程序IP执行子程序 2转子程序2返回子程序1IP(下)执行子程序1继续执行子程序1(a)(b)子程序调用示意图(a) 主程序调子程序; (b) 子程序嵌套示意图压栈弹出IP(下)q 调用子程序(或过程)或发生中断时要保护断点的地址,调用子程序(或过程)或发生中断时要保护断点的地址, 子程序或中断返回时恢复断点。子程序或中断返回时恢复断点。子程序嵌套子程序嵌套.断点2(L)断点2(L)断点2(H)断点2(H)断点1(L)断点1(L)断点1(H)断点1(H).(SP)(SP)先先压压入入后后压压入入先先弹弹出出后后弹弹出出堆堆栈栈段段断
19、点地址压入和弹出情况断点地址压入和弹出情况主主程程序序子子程程序序1 1子子程程序序2 2断点1断点1断点2断点2弹出弹出断点2断点2弹出弹出断点1断点1q 保存保存CPU内部的寄存器或存储器中的数据内部的寄存器或存储器中的数据, 使用数据时将其弹出:使用数据时将其弹出: PUSH AX; 将将(AX)入栈入栈.11112222(SP)-2(SP)-2(SP)-1(SP)-1(SP)(SP)堆堆栈栈段段PUSH AX前PUSH AX前(AX).22H22H11H11H.11H11H22H22H(SP)(SP)(SP)+1(SP)+1(SP)+2(SP)+2堆堆栈栈段段PUSH AX后PUSH
20、AX后(AX)使用数据时将其弹出:使用数据时将其弹出:POP BX.22H22H11H11H.33H33H44H44HBXBX(SP)(SP)(SP)+1(SP)+1(SP)+2(SP)+2堆堆栈栈段段POP BX前POP BX前.22H22H11H11H.11H11H22H22HBXBX(SP)-2(SP)-2(SP)-1(SP)-1(SP)(SP)堆堆栈栈段段POP BX后POP BX后堆栈指令使用时应注意几点:堆栈指令使用时应注意几点:堆栈操作总是按堆栈操作总是按字字进行进行不能从栈顶弹出一个字给不能从栈顶弹出一个字给CSCS堆栈指针为堆栈指针为SS:SPSS:SP,SPSP永远指向栈顶
21、永远指向栈顶SPSP自动进行增减量(自动进行增减量(-2-2,+2+2),),SPSP始终指始终指向一个实单元向一个实单元 堆栈应用举例:堆栈应用举例: 例例 : PUSH AXPUSH BXPUSH CXPOP CXPOP BX POP AX(Exchange)格式:格式:XCHG dest , src;(dest) (src)执行操作:执行操作: 可以可以 实现:实现: 应用举例:应用举例:XCHG BL,DLXCHG AX,SIXCHG COUNTDI, AX注意:注意: 存储器之间不能交换,存储器之间不能交换,两个操作数中必须有一个在寄存两个操作数中必须有一个在寄存器中;器中; 段寄存
22、器不能作为一个操作数;段寄存器不能作为一个操作数;XCHG BX,DI(错)错)XCHG DS, AX (错)错)必须通过累加器必须通过累加器AX(字)或字)或AL(字节)字节)(1)输入输出指令:)输入输出指令: (Input byte or word) (Output byte or word) 输入指令输入指令用于用于CPU从外设端口接受数据从外设端口接受数据, 输出指令输出指令用于用于CPU向外设端口发送数据。向外设端口发送数据。 每个外设要占几个端口:数据口,状态口和控制口。每个外设要占几个端口:数据口,状态口和控制口。CPUCPUI/OI/O设备设备译译码码数据端口数据端口DBDB
23、ABABCBCBI/O接口I/O接口状态端口状态端口控制端口控制端口在在IBMPC机里,可以配接许多外部设备,机里,可以配接许多外部设备,每个外设与每个外设与CPU之间交换数据,状态信息和控制命令,之间交换数据,状态信息和控制命令,每一种信息交换都要通过一个端口来进行。每一种信息交换都要通过一个端口来进行。端口数:外部设备最多有端口数:外部设备最多有65536个个I/O端口。端口。 A0A15译码形成。译码形成。端口号:端口号(即外设端口地址)为端口号:端口号(即外设端口地址)为0000HFFFFH。PC机仅使用机仅使用A0A9译码形成译码形成I/O口地址,即口地址,即1024H个口地址个口地
24、址 端口号:端口号:0000H03FFH只限于用累加器AL或AX来传送信息。功能: (累加器)I/O端口格式:直接输入直接输入/ /输出和间接输入输出和间接输入/ /输出指令输出指令(1)直接输入直接输入/ /输出:指令中直接给出端口号输出:指令中直接给出端口号例:IN AL,80H ;(AL)(80H端口) OUT 68H,AX ;(69H,68H)(AX)可访问的端口范围 00HFFH0-255 例: MOV DX,220H IN AL,DX ;将220H端口内容读入AL在使用间接寻址的IN/OUT指令时,要事先用传送指令把I/O端口号设置到DX寄存器可访问的端口范围 0000-FFFFH
25、(0-65535)( (2) 2) 间接输入间接输入/ /输出指令输出指令 端口号在端口号在DXDX寄存器中寄存器中例例1:实现:实现(29H)(28H)(DATA_WORD) IN AX,28H MOV DATA_WORD,AX例例2:从端口:从端口3FCH 送一个字到送一个字到AX寄存器寄存器MOV DX,3FCH IN AX,DX ; (AL)(3FCH),), (AH)(3FDH) 该指令不影响标志位。该指令不影响标志位。XLAT指令使用方法指令使用方法: 先建立一个表格;先建立一个表格; (相对与表格首地址位移量)(相对与表格首地址位移量); (表中第一个元素的序号为(表中第一个元素
26、的序号为0) 。 (AL)为转换的代码。为转换的代码。例:从字符到例:从字符到ASCII码的转换码的转换先在内存的数据段中存放十六进制数字的先在内存的数据段中存放十六进制数字的ASCII码表。码表。 首地址为:首地址为:Hex_table 执行指令序列执行指令序列:MOV BX,OFFSET Hex_tableMOV AL,0AH XLAT 假设:假设:(DS)=F000H, Hex_table=0040H(AL)=0AH执行执行XLAT以后:以后: (AL)=41H即即“A”的的ASCII码。码。30H30H31H31H32H32H.39H39H41H41H42H42H.46H46H.Hex
27、_tableHex_tableHex_table+1Hex_table+1Hex_table+2Hex_table+2Hex_table+0AHHex_table+0AHHex_table+0BHHex_table+0BHHex_table+0FHHex_table+0FHFFBBAA9911220016进制数的进制数的ASCII码表码表(Address-object transfer) 8086 /8088 提供三条提供三条:地址指针写入指定寄存器或寄存器对指令。地址指针写入指定寄存器或寄存器对指令。1、LEA(Load Effective Address)2、LDS (Load point
28、er using DS)3、LES (Load pointer using ES)(Load Effective Address)格式:格式: LEA reg16 , mem16 ;EA(reg16) 。例:设(例:设(BX)=0400H,(,(SI)=003CHLEA BX,BX+SI+0F62H执行指令后:执行指令后: EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH(BX)=139EH注意:设注意:设 (DS)=3000HBUFFER=1000H(31000H)=0040H(1) LEA 指令与指令与MOV 的区别的区别LEA BX , BUFFER
29、;(;(BX)=1000HMOV BX , BUFFER ; (BX)=0040H LEA 指令与指令与MOV等价等价LEA BX , BUFFER ; (BX)=1000HMOV BX , OFFSET BUFFER ; (BX)=1000H40H40H00H00H.3000H:1000H3000H:1000H(DS)(DS) BUFFERBUFFER31001H31001H.存储器存储器 (Load pointer using DS)格式:格式:LDS reg16, mem32 ;(;(reg16)(EA) (DS)(EA)+2)功能:功能:。将指令指定将指令指定mem32单元的前两个单元
30、内容单元的前两个单元内容(16位偏移量位偏移量)装入指装入指定通用寄存器,把后两个单元内容定通用寄存器,把后两个单元内容(段地址段地址) 装入到装入到DS段寄存段寄存器。器。用于写远地址指针。用于写远地址指针。例例: 假设:假设: (DS)=C 000H指令指令: LDS SI, 0010H执行指令后执行指令后: (SI)=0180H (DS)=2000H 80H80H01H01H00H00H20H20HC000H:0010HC000H:0010H(DS)(DS)C0011HC0011HC0012HC0012HC0013HC0013H.存储器存储器格式:格式:LES reg16, mem32
31、;(;(reg16)(EA) (ES)(EA)+2)功能:功能: 此指令常常指定此指令常常指定DI寄存器。寄存器。将指令指定将指令指定mem32单元的前两个单元内容单元的前两个单元内容(16位偏移量位偏移量)装入装入指定通用寄存器,把后两个单元内容指定通用寄存器,把后两个单元内容(段地址段地址) 装入到装入到ES段段寄存器。寄存器。用于写远地址指针。用于写远地址指针。例例: 假设:假设: (DS)=B 000H (BX)=080AH指令指令: LES DI, BX执行指令后执行指令后: (DI)=05A2H (ES)=4000HA2HA2H05H05H00H00H40H40HB000H:080
32、AHB000H:080AH(DS)(DS)B080BHB080BHB080CHB080CHB080DHB080DH.存储器存储器(BX)(BX)综合举例:综合举例:设:设: (DS)=5000H TABLE=1000H分析下列指令执行结果:分析下列指令执行结果: MOV BX,TABLE ;(;(BX)=0040H MOV BX,OFFSET TABLE ;(;(BX)=1000H LEA BX,TABLE ;(;(BX)=1000H LES BX,TABLE ;(;(BX)=0040H,(,(ES)=3000H LDS BX,TABLE ;(;(BX)=0040H,(,(DS)=3000H4
33、0H40H00H00H00H00H5000H:1000H5000H:1000H(DS)(DS) TABLETABLE51001H51001H.存储器存储器30H30H.51002H51002H51003H51003H(Flag register transfer)采用了隐含寄存器(采用了隐含寄存器(AH、Flags)操作数方式。操作数方式。用于读取或设置标志寄存器;将标志寄存器的值入用于读取或设置标志寄存器;将标志寄存器的值入栈或出栈。栈或出栈。 8088有四条标志传送操作指令:有四条标志传送操作指令:1LAHF(Load AH into flags)2SAHF(Store AH into f
34、lags) 3PUSH F(Push flags onto stack)4POP F(Pop flags off stack) (Load AH flags flags)格式:格式:LAHF ;(;(AH)(PSW的低字节)的低字节)功能:功能:。SFSFZFZFAFAFPFPFCFCF0 01 12 23 34 45 56 67 7TFTFIFIFDFDFOFOF8 89 91010111112121313141415150 01 12 23 34 45 56 67 7FLAGSFLAGSAHAHLAHF指令操作图示意指令操作图示意2SAHF(Store AH into flags)格式:格式:SAHF ;(;(PSW的低字节)的低字节)(AH)功能:(功能:(AH)送标志寄存器低八位。)送标志寄存器低八位。3PUSHF(Push flags onto stack)格式:格式:PUSH F;(;(SP)(SP)-2 (SP)+1,(,(SP)(PSW)功能功能 : 标志进栈。标志进栈。4POPF(Pop flags off stack) 格式:格式:POP F;(;(PSW)(SP)+1,(,(SP) (SP)(SP)+2 功能功能 :标志出栈。:标志出栈。