《《指令集参考》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《指令集参考》PPT课件.ppt(110页珍藏版)》请在三一办公上搜索。
1、第18章 8086/8088指令集参考,18.1 指令码编码规则 18.2 按字母顺序排列的指令集,18.1 指令码编码规则,18.1.1 寄存器的编码 使用寄存器的机器指令码,可用3位指明是哪一个寄存器,并有一个用来表示其“宽度”为字节或字的“w”位。此外,只有某些指令可以存取到段寄存器。图18-1列出了所有寄存器的编码。,-通用、基地址及段寄存器编码 编码 w=0 w=1 000 AL AX 001 CL CX 010 DL DX 011 BL BX 100 AH SP,101 CH BP DH SI BH DI编码 段寄存器00 ES01 CS10 SS11 DS-,图18-1 寄存器编
2、码,例如,下面的MOV指令具有一个字节的立即数:MOV AH,00 10110 100 00000000 w reg=AH 此例中,机器码的第一个字节,指出操作数为一个字节(w=0),并且用到AH寄存器(100)。应注意,不要从此例太早下结论,有些指令的w和reg可能在不同的位置。,18.1.2 定址形态模式字节 若机器指令码内含有定址形态模式字节,则它通常是第二个字节,并且是由下列三部分组成的:(1)mod:占2位,表示定址形态模式,11表示用到了寄存器,而00、01及10表示用到了内存单元。(2)reg:占3位,表示用到了寄存器。(3)r/m:占3位,表示用到了寄存器或内存,r表示哪一个寄
3、存器,m表示内存单元地址。,机器指令码的第一个字节可能含有“d”位,表示第一个字节和第二个字节间的流向。例如,将AX加给BX:ADD BX,AX 00000011 11 011 000 dw mod reg r/m 此例中d=1,表示mod(11)及reg(011)描述的是第一个操作数BX;而r/m(000)描述的是第二个操作数。因为w=1,所以宽度是一个字。因此这个指令就是把AX(000)加给BX(011)。机器指令码的第二个字节,通常用来指出内存的定址形态模式。下面将更详细探讨定址形态模式。,1.mod位 mod 的两个位用来区分是寄存器还是内存的定址,其用法如下:00 以r/m位选用一种
4、定址模式,没有“偏移地址”字节。其中当r/m110时指定为直接寻址方式01 以r/m位选用一种定址模式,有一个“偏移地址”字节10 以r/m位选用一种定址模式,有两个“偏移地址”字节11 以r/m位选用一个寄存器,“w”位(在操作码字节)决定它用到的是8位或16位的寄存器,2.reg位 reg的3个位配合w位决定实际使用的是8位或16位的寄存器。3.r/m位 r/m的3个位(寄存器/内存)配合mod决定定址模式,见图18-2。,-r/m mod=00 mod=01 mod=10 mod=11 mod=11 w=0 w=1000BX+SIBX+SI+dispBX+SI+dispALAX001BX
5、+DIBX+DI+dispBX+DI+dispCL CX010BP+SIBP+SI+dispBP+SI+dispDLDX011BP+DIBP+DI+dispBP+DI+dispBLBX,100 SI SI+disp SI+dispAHSP101 DI DI+disp DI+dispCHBP110Direct BP+disp BP+dispDHSI111 BX BX+disp BX+dispBHDI-,图18-2 r/m位,18.1.3 2字节指令例18.1 将AX加给BX。ADD BX,AX 0000 0011 11 011 000 dw mod reg r/md 1 指用reg及w描述第一个
6、操作数(BX),用mod、r/m及w描述第二个操作数(AX)w 1 表示宽度为一个字,mod 11 表示第二个操作数是一个寄存器reg 011表示第一个操作数是BX寄存器r/m 000表示第二个操作数是AX寄存器,例18.2 AL乘以BL。MUL BL 11110110 11 100 011 w mod reg r/m MUL指令假设AL内放着被乘数。宽度(w=0)是一个字节,mod表示要用到寄存器,而寄存器是BL(011)。reg=100在此没意义。,18.1.4 3字节指令 下面的MOV指令产生3字节的指令机器码:MOV mem,AX 10100001 dddddddd dddddddd
7、从累加器(AX或AL)进行传送时,必须明确处理的对象是字节还是字。本例中,w=1表示字,所以用到了16位的AX。若第二个操作数是AL,则w=0。第2、3字节表示的是内存单元的偏移地址。使用累加器的指令通常会产生高效率的机器指令码。,18.1.5 4字节指令 例18.3 将AL乘以一个内存单元。微处理器假设若为字节乘,则被乘数在AL中,若为字乘,则被乘数在AX中。MUL mem_byte 11110110 00 100 110 w mod reg r/m 对于此指令,reg永远为100,mod=00表示用到内存单元,r/m=110意为直接引用内存单元。机器指令操作码后紧跟着两个提供内存单元的偏移
8、地址的字节。,例18.4 LEA指令返回指定内存单元地址。LEA DX,mem 10001101 00 010 110 LEA mod reg r/m reg=010代表DX寄存器。mod=00及r/m=110表示直接引用内存单元。紧跟着的两个字节提供内存单元的偏移地址。,18.2 按字母顺序排列的指令集,本节按字母顺序列出指令集。为简洁起见,把某些指令如移位及循环移位排在一起。另外对于8086、80286及80386微处理器,提供了一些本书范围以外的特殊指令。除了前面讨论的状态字节及宽度位以外,以下列出有关指令中的缩写:,addr 内存单元的地址addr-high内存单元地址的高字节addr
9、-low 内存单元地址的低字节data 立即数(若w=0为8位,w=1则为16位)data-high立即数的高字节data-low立即数的低字节disp 偏移地址(增量或偏移量)reg 寄存器,*AAA:加法的ASCII调整 功能:调整存放在AL内的两个ASCII字节的和。请参阅11.1.1节ASCII数相加。标志位:影响AF及CF(OF、PF、SF及ZF不确定)。机器码:00110111(无操作数)*AAD:除法的ASCII调整功 能:调整ASCII值的除法。请参阅11.1.4节ASCII除法。标志位:影响PF、SF、ZF(AF、CF及OF不确定)。机器码:|11010101|0000101
10、0|,*AAM:乘法的ACSII调整功能:调整两个非压缩型十进制数相乘的积。AAM先把AL除以10,然后,商存于AH,除数留于AL。AAM无操作数。请参阅11.1.3节ASCII乘法。标志位:影响PF、SF及ZF(AF、CF及OF不确定)。机器码:|11010100|00001010|*AAS:减法的ACSII调整功能:调整AL内两个ASCII字节的差。请参阅11.1.2节ASCII减法。标志位:影响AF及CF(OF、PF、SF及ZF不确定)。机器码:00111111,*ADC:带进位的二进制加法 功能:通常用于多字节的二进制加法。若CF标志被设定为1,ADC首先把第一个操作数加1,接着就像A
11、DD指令,总是把第二个操作数加到第一个操作数。标志位:影响AF、CF、OF、PF、SF及ZF。,机器码:(3种格式)Reg/mem with reg:|000100dw|mod reg r/m|Immed to accum r:|0001010w|-data-|data if w=1|Immed to reg/mem:|100000sw|mod 010 r/m|-data-|data if sw=01|,*ADD:二进制加法 功能:把内存单元、寄存器或立即操作数的字节或字的值加给寄存器,或把寄存器、立即操作数的字节或字加给内存单元。标志位:影响AF、CF、OF、PF、SF及ZF。机器码:(3种
12、格式)Reg/mem with reg:|000000dw|mod reg r/m|Immed to accum r:|0000010w|-data-|data if w=1|Immed to reg/mem:|100000sw|mod 000 r/m|-data-|data if sw=01|,*AND:逻辑与 功能:对两个操作数的每个位作逻辑与(AND)运算,两个操作数分别置于寄存器或内存单元,同为字节或字。第二个操作数可为立即操作数。若相对应的两个位都是1,则AND把第一个操作数的位设成1,否则设成0。请参阅OR、XOR及TEST。,机器码:(3种格式)Reg/mem with reg:
13、|001000dw|mod reg r/m|Immed to accum r:|0010010w|-data-|data if w=1|Immed to reg/mem:|1010000w|mod 100 r/m|-data-|data if w=1|,*CALL:调用子程序 功能:调用一个NEAR或FAR的子程序。从子程序返回主程序用RET指令。CALL指令把SP减小,并把下一条指令的地址(即IP的内容)压入堆栈顶端,然后把目标处的地址(偏移地址)送给IP。当返回调用程序时,RET指令把这些内容还原。依段内或段间调用有4种CALL指令。段间的CALL先递减SP的值,把CS压入堆栈,然后把IP
14、压入堆栈。标志位:无影响。,机器码:(4种格式)Direct within segment:|11101000|disp-low|disp-high|Indir.within segment:|11111111|mod 010 r/m|Indirect intersegment:|11111111|mod 011 r/m|Direct intersegment:|10011010|offset-low|offset-high|seg-low|seg-high|,*CBW:字节扩展成字 功能:把AL内一个带符号字节数扩展成一个字。CBW把AL的正负号(bit 7)扩展到整个AH。请参阅10.5.
15、2节的字节转换成字指令CBW。标志位:无影响。机器码:10011000(无操作数)*CLC:清进位标志CF 功能:把CF标志位清为0,例如使ADC指令不至于多加1。CLC无操作数。请参阅STC。标志位:CF(清为0)。机器码:11111000,*CLD:清方向标志DF 功能:把DF标志位清为0,使CMPS及MOVS之类的字符串运算指令从左向右执行。请参阅STD。标志位:DF(清为0)。机器码:11111100(无操作数)*CLI:清中断标志IF 功能:使出现在处理器INTR引脚线上的“可屏蔽外部中断”失效,并将IF标志位清0。请参阅STI。标志位:IF(清为0)。机器码:11111010(无操
16、作数),*CMC:取反CF 功能:把进位标志CF变成它的反,使CF的值,0变成1或1变成0。标志位:CF(取反)。机器码:11110101(无操作数),*CMP:比较 功能:比较两个数据的大小。CMP在内部将第一个操作数减去第二个操作数,但不改变第一个操作数的值。操作数必须同为字节或字。CMP可把寄存器、内存型数据或立即数与寄存器比较,或把寄存器、立即数与内存型数据比较。标志位:影响AF、CF、OF、PF、SF及ZF。,机器码:(3种格式)Reg/mem with reg:|001110dw|mod reg r/m|Immed to accum r:|0011110w|-data-|data
17、if w=1|Immed to reg/mem:|100000sw|mod111r/m|-data-|data if sw=01|,*CMPS/CMPSB/CMPSW:字符串比较 功能:比较两个任意长度的字符串。这类指令通常配合指令前缀REPn使用,例如,REPE CMPSB。CMPSB比较内存中的字节,而CMPSW则比较内存中的字。DS:SI寄存器组对第一个操作数定址,ES:DI寄存器组对第二个操作数定址。若DF标志位为0,则比较方向由左向右,SI及DI递增。若DF为1,则比较方向由右向左,SI及DI递减。标志位:影响AF、CF、OF、PF、SF及ZF。机器码:1010011w,*CWD:扩
18、展字成为双字 功能:把AX内的一个带符号数字,经由正负号(第15位)扩展至DX的所有位而成为DX:AX双字。通常用来产生32位的被除数。请参阅10.5.3节的字转换成双字指令CWD。标志位:无影响。机器码:10011001(无操作数),*DAA:加法的十进制调整 功能:AL内是加的结果,而且是压缩型的十进制数(BCD数),DAA调整AL内的两个BCD数。若最右边4位的值大于9或AF标志位为1,则DAA把AL加06并将AF标志置“1”。若AL的值大于9F或CF标志位为1,DAA把AL加60(Hex),并将CF标志置“1”。请参阅DAS。标志位:影响AF、CF、PF、SF及ZF(OF不确定)。机器
19、码:00100111(无操作数),*DAS:减法的十进制调整 功能:AL内是减的结果,而且是压缩型的十进制数(BCD数),DAS调整AL内的两个BCD数。若最右边4位的值大于9或AF标志位为1,则DAS把AL减去Hex 60并将CF标志置“1”。请参阅DAA。标志位:影响AF、CF、PF、SF及ZF。机器码:00101111(无操作数),*DEC:减1 功能:把寄存器或内存单元的字节或字减1,例如DEC CX。请参阅INC。标志位:影响AF、OF、PF、SF或ZF。机器码:(2种格式)Register:|01001reg|Reg/memory:|1111111w|mod 001 r/m|,*D
20、IV:无符号数除法 功能:无符号的被除数(16或32位)除以无符号除数(8或16位)。请参阅10.4.1节的无符号数除法指令DIV。标志位:影响AF、CF、OF、PF、SF及ZF(全部不确定)。机器码:|1111011w|mod 110 r/m|,*ESC:微处理器放弃 功能:使协处理器执行特殊功能。有些功能要用8087或80287之类的协处理器作浮点运算。ESC指令把要处理的指令及操作数交给协处理器。标志位:无影响。机器码:|11011 x x x|mod xxx r/m|(x位不重要),*HLT:微处理器暂停 功能:使微处理器在等待中断时进入暂停状态。HLT使CS及IP指到跟着HLT的下一
21、条指令,然后处理器暂停。当中断发生时,微处理器把CS及IP压入堆栈,然后执行中断服务程序。返回调用程序时,IRET指令把堆栈内容取出,从原来跟着HLT的下一条指令处开始执行。标志位:无影响。机器码:11110100(无操作数),*IDIV:有符号数除法 功能:有符号的被除数(16或32位)除以有符号的除数(8或16位)。请参阅10.4.2节的带符号数除法指令IDIV。标志位:影响AF、CF、OF、PF、SF及ZF。机器码:|1111011w|mod 111 r/m|,*IMUL:有符号数乘法 功能:有符号数(8或16位)相乘。IMUL把最高位的1看成符号。请参阅10.3.2节的带符号数乘法指令
22、IMUL。标志位:影响CF和OF(AF、PF、SF及ZF不确定)。机器码:|1111011w|mod 101 r/m|,*IN:输入 功能:从输入端口(Port)把一个字节数据传送给AL或把一个字传送给AX。输入端口可写成固定的数值操作数即直接地址(例如,IN AX,port#),或DX内的一个地址值(例如 IN AX,DX)。8086、80286及80386提供INS(Input String)指令。请参阅OUT。标志位:无影响。机器码:(2种格式)Variable port:|1110110w|Fixed port:|1110010w|-port-|,*INC:加1 功能:把寄存器或内存单
23、元的字节或字加1,例如,写成INC CX。请参阅DEC。标志位:影响AF、OF、PF、SF或ZF。机器码:(2种格式)Register:|01000 reg|Reg/memory:|1111111w|mod 000 r/m|,*INT:中断 功能:中断正在执行的程序,并把控制权转移给256个中断(向量)地址中的一个。INT做下列事情:把SP减2,标志寄存器压入堆栈,并重新设置IF及TF标志;把SP减2,CS压入堆栈,再把中断向量的两个高字节拼成一个字放入CS;把SP减2,IP压入堆栈,再把中断向量的两个低字节拼成一个字放入IP。标志位:影响IF及TF。机器码:|1100110 v|-type-
24、|(if v=0 type is 3),*INTO:溢出中断 功能:若发生溢出则产生中断(OF标志位被设置为“1”),并执行INT 04。中断地址放在地址Hex 10H处。请参阅INT。标志位:无影响。机器码:11001110(无操作数),*IRET:中断返回 功能:从中断服务程序返回主程序,IRET做下列事情:把栈顶的字取出送给IP然后SP加2;再把栈顶的字取出放入CS,SP加2;取出栈顶的字放入标志寄存器,SP加2。此指令把中断时做的事还原然后返回。请参阅RET。标志位:影响全部。机器码:11001111(无操作数),*JA/JNBE:大于或不小于、等于转 功能:测试一个无符号的数据后,将
25、控制权转移到另一个地址。若CF=0且ZF=0,指令将操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01110111|-disp-|,*JAE/JNB:大于、等于或不小于转 功能:测试一个无符号的数据后,将控制权转移到另一个地址。若CF=0,把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01110011|-disp-|,*JB/JNAE:小于或不大于、等于转 功能:测试一个无符号的数据后,将控制权转移到另一个地址。若CF=1,把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01110010|-disp-|,*JBE/JNA:小于、等于或不大于转
26、功能:测试一个无符号的数据后,将控制权转移到另一个地址。若CF=1或AF=1,则把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01110110|-disp-|*JC:CF=1 转 功能:见JB/JNAE(具有相同的作用)。,*JCXZ:CX=0 转 功能:若CX为0则跳到指定地址。JCXZ在循环的开始可能会很有用。标志位:无影响。机器码:|11100011|-disp-|*JE/JZ:若为0或相等转(ZF=1)功能:测试一个有符号或无符号的数据后,将控制权转移到另一个地址。若标志位ZF=1,把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01110100|-d
27、isp-|,*JG/JNLE:大于或不小于、等于转 功能:测试一个有符号的数据后,将控制权转移到另一个地址。若标志SF与OF不相等,把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01111100|-disp-|,*JLE/JNG:小于、等于或不大于转 功能:测试一个带符号的数据后,将控制权转移到另一个地址。若标志ZF=1或标志SF与OF不相等,把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01111110|-disp-|,*JMP:无条件转 功能:无条件跳转到指定地址。JMP用目标位置的偏移地址取代IP的内容。段内及段间跳转控制一共有五种用法。段间跳转时CS
28、也要改变成新的段地址。标志位:无影响。机器码:(5种格式),Direct within segment:|11101001|disp-low|disphigh|Direct within seg short:|11101011|-disp-|Indirect within segment:|11111111|mod 100 r/m|Indirect intersegment:|11111111|mod 101 r/m|Direct intersegment:|11101010|offset-low|offset-high|seg-low|seg-high|,*JNC:若无进位转(C=0)功能:
29、见JAE/JNB(具有相同的作用)。*JNE/JNZ:若不相等或不等于0转 功能:测试一个有符号或无符号的数据后,将控制权转移到另一个地址。若标志ZF=0,则把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01110101|-disp-|,*JNO:若无溢出转(OF=0)功能:若未发生溢出则跳转到指定地址。若OF=0,则把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01110001|-disp-|*JNP/JPO:若奇校验转(PF=0)功能:若奇偶校验后PF0,跳到指定地址。PF0是奇校验,指运算结果的低8位含有1的个数为奇数,把操作数(偏移地址)加给IP实现
30、跳转。请参阅JP/JPE。标志位:无影响。机器码:|01111011|-disp-|,*JNS:若为正数转(SF=0)功能:若符号位被设成“0”(正值),跳到指定地址。SF=0,把操作数(偏移地址)加给IP实现跳转。请参阅JS。标志位:无影响。机器码:|01111001|-disp-|*JO:若溢出转(OF=1)功能:若发生溢出,跳到指定地址。OF=1,把操作数(偏移地址)加给IP实现跳转。请参阅JNO。标志位:无影响。机器码:|01110000|-disp-|,*JP/JPE:若偶校验转(PF=1)功能:若产生偶校验,跳到指定地址。偶校验是指运算后的低8位含有1的个数为偶数,PF=1(偶校验
31、),把操作数(偏移地址)加给IP实现跳转。请参阅JNP/JPO。标志位:无影响。机器码:|01111010|-disp-|,*JS:若为页数转(SF=1)功能:若符号位被设成“1”(负值),跳到指定地址。SF=1,把操作数(偏移地址)加给IP实现跳转。标志位:无影响。机器码:|01111000|-disp-|,*LAHF:标志寄存器的低8位装入AH 功能:把标志寄存器的低8位装入AH。这个指令与8080兼容。请参阅SAHF,LAHF(无操作数)。标志寄存器的低8位如下:S Z*A*P*C(*表示没用到的位)标志位:无影响。机器码:10011111,*LDS:地址传送(DS)功能:LDS把保存在
32、内存中的偏移地址及段地址(4个字节)装入目标寄存器组。段地址放在DS而偏移地址可放入任何一个通用或索引寄存器,下面的例子是把偏移地址装入DI,而把接下来的两个字节的高地址的内容送到DS:LDS DI,memory-addr 标志位:无影响。机器码:|11000101|mod reg/m|,*LES:地址传送(ES)功能:请参阅LDS,更换的是ES而不是DS。标志位:无影响。机器码:|11000100|mod reg/m|,*LODS/LODSB/LODSW:重复装入字符串 功能:把内存单元中的一个字节装入AL或把一个字装入AX,虽然LODS是字符串型运算,却不适合用指令前缀REP。DS:SI寄
33、存器组指向一个字节(若用LODSB)或一个字(若用LODSW),并把它从内存单元装入AL或AX。若标志DF为0,则此指令把SI加1(若是字节)或加2(若是字),否则就减1或减2。标志位:无影响。机器码:1010110w(无操作数),*LOOP:无条件循环 功能:控制一段程序按指定的次数执行。开始执行循环前就把次数放在CX内,LOOP指令一般放在循环体的底部;先把CX-1,若CX0,把操作数(偏移地址)加给IP,实现循环;否则执行LOOP下一条指令,即退出循环。标志位:无影响。机器码:|11100010|-disp-|,*LOOPE/LOOPZ:条件循环(CX0或ZF1)功能:控制一段程序按指定
34、的次数执行或直到ZF标志被清0为止。LOOPE/LOOPZ和LOOP相似,先把CX-1;不同之处在于若CX0或者ZF0则退出循环,否则继续循环,即把操作数(偏移地址)加给IP。请参阅LOOPNE/LOOPNZ。标志位:无影响。机器码:|11100001|-disp-|,*LOOPNE/LOOPNZ:条件循环(CX0或ZF0)功 能:控制一段程序按指定的次数执行或直到ZF标志被置成1为止。LOOPNE/LOOPNZ和LOOP相似,先把CX-1,若CX=0或者ZF=1退出循环,否则继续循环,即把操作数(偏移地址)加给IP,实现循环。请参阅LOOPE/LOOPZ。标志位:无影响。机器码:|11100
35、000|-disp-|,*MOV:传送数据 功能:在两个寄存器之间或寄存器与内存单元之间传送一个字节或字的数据或把立即数传送给寄存器或内存段单元。MOV不能在两个内存单元之间传送数据,请参阅MOVS。根据操作数不同,有7种MOV指令。标志位:无影响。机器码:(7种格式),Reg/mem to/from reg:|100010dw|mod reg r/m|Immed to reg/mem:|1100011w|mod 000 r/m|-data-|data if w=1|Immed to register:|1011w reg|-data-|data if w=1|Mem to accumulat
36、or:|1010000w|addr-low|addr-high|Accumulator to mem:|1010001w|addr-low|addr-high|Reg/mem to seg reg:|10001110|mod 0sg r/m|(sg=seg reg)Seg reg to reg/mem:|10001100|mod 0sg r/m|(sg=seg reg),*MOVS/MOVSB/MOVSW:字符串传送 功能:在内存区域之间传送数据,通常配合指令前缀REP,MOVSB可以在两个内存区域传送任意多个字节,而MOVSW可以传送任意多个字。ES:DI确定第一个(目的)操作数的地址,而D
37、S:SI确定第二个(源)操作数地址。若DF标志为0,DI及SI递增;若DF为1,则DI及SI递减。标志位:无影响。机器码:1010010w(无操作数),*MUL:无符号乘法 功能:无符号的被乘数(8或16位)与乘数(8或16位)相乘。MUL把最高位看成数据而不是符号。8位相乘时,被乘数放在AL内,乘数放在寄存器或内存单元中,例如MUL CL,积放在AX内。16位的乘法时,被乘数放在AX,乘数放在寄存器或内存单元中,例如MUL BX,积放在DXAX。标志位:影响CF及OF(AF、PF、SF及ZF不确定)。机器码:|1111011w|mod 100 r/m|,*NEG:正负变换 功能:改变二进制值
38、的正负,即由正变负或由负变正。NEG的操作是用0减去操作数,即操作数包括符号位,全部取反(1变0或0变1)后加1。例如,01H(+1)经NEG后变为0FFH(-1)。操作数可为寄存器或内存单元的一个字节或字。请参阅NOT。标志位:影响AF、CF、OF、PF、SF及ZF。机器码:|1111011w|mod 011 r/m|,*NOP:空操作 功能:当你要删除或插入机器码,又希望其他指令地址不发生变动,或想延长执行时间时,可用此命令替代。NOP执行的是XCHG AX,AX,不改变任何东西,只是IP增值。标志位:无影响。机器码:10010000(无操作数),*NOT:逻辑非 功能:把0变成1或1变成
39、0。操作数是寄存器或内存单元的一个字节或字。请参阅NEG。标志位:无影响。机器码:|1111011w|mod 010 r/m|*OR:逻辑或 功能:对两个操作数的每个位作逻辑OR。两个操作数必须是寄存器或内存单元的字节或字,第二个操作数可以是立即数。OR把两个操作数的每一个位逐一比较。若相对应的两个位有任何一个是1,则第一个操作数的该位变成1,否则就不改变。请参阅AND及XOR。,标志位:影响CF、OF、PF、SF及ZF(AF不确定)。机器码:(3种格式)Reg/mem with reg:|000010dw|mod reg r/m|Immed to accum r:|0000110w|-dat
40、a-|data if w=1|Immed to reg/mem:|1000000w|mod 001 r/m|-data-|data if w=1|,*OUT:输出 功能:从AL送出一个字节或从AX送出一个字至输出端口。可把输出端口写成直接地址(例如OUT port#,AX)或DX内为一个端口地址(例如OUT DX,AX)。8086、80286及80386提供OUTS(输出字串)指令。请参阅IN。标志位:无影响。机器码:(2种格式)Variable port:|1110111w|Fixed port:|1110011w|-port-|,*POP:堆栈弹出 功能:把一个字(先前被压入堆栈者)弹出到
41、指定的目的地。SP寄存器指向当前栈顶的字。POP把此字弹出给指定的目的地并使SP+2。根据目的地是寄存器、段寄存器或内存单元的不同,而有3种POP指令。请参阅PUSH。标志位:无影响。机器码:(3种格式)Register:|01011 reg|Segment reg:|000sg111|(sg implies segment reg)Reg/memory:|1000111/m|mod 000 r/m|,*POPA:堆栈弹出给所有寄存器(8088、8086、80286)功能:依次将堆栈内容弹出给DI、SI、BP、SP、BX、DX、CX、AX寄存器,并将SP加16,通常在此之前已用PUSHA将这些
42、寄存器压入堆栈中。SP值其实已被丢掉而没压入。标志位:无影响。机器码:01100001(无操作数),*POPF:堆栈弹出给标志寄存器 功能:将堆栈(先前被压入堆栈者)弹出给标志寄存器。请参阅PUSHF及POP。SP寄存器指向当前栈顶的字,POPF把该字弹出给标志寄存器,并把SP加2。该字通常是用PUSHF压入堆栈的标志寄存器内容,而POPF把这些标志位还原。POPF不带操作数。标志位:影响全部。机器码:10011101(无操作数),*PUSH:压入堆栈 功能:把一个字的值(地址或数据项)保存于堆栈以便将来使用。SP寄存器指向当前栈顶的字,PUSH将SP减2并从指定操作数把一个字压入新的栈顶。根
43、据操作数是寄存器、段寄存器或内存字单元的不同,而有3种PUSH指令。请参阅POP及PUSHF。标志位:无影响。,机器码:(3种格式)Register:|01010 reg|Segment reg:|000sg 110|Reg/memory:|11111111|mod 110 r/m|,*PUSHA:所有寄存器压入堆栈(8088、8086、80286)功能:把AX、CX、DX、BX、SP、BP、SI、DI依次压入堆栈中并把SP减16,通常稍后POPA将这些寄存器内容弹出堆栈。标志位:无影响。机器码:01100000(无操作数),*PUSHF:标志寄存器压入堆栈 功能:把标志寄存器的内容保存于堆栈
44、以供将来使用。SP寄存器指向当前栈顶的字,PUSHF把SP减2,再把标志寄存器压入新的栈顶。请参阅POPF及PUSH。标志位:无影响。机器码:10011100(无操作数),*RCL与RCR:带进位循环左移与右移 功能:经由CF标志向左或向右循环移动。这个指令的操作对象可以是寄存器或内存单元的一个字节或字。若只移动1位,则可把操作数指定为1;若超过1位则需要把循环移动的位数放在CL寄存器中。RCL循环左移,最左边(最高)的位进入CF标志而CF位进入第0位,其余各位依序向左移。RCR循环右移,第0位进入CF标志位而CF位进入最左边(最高)位,其余各位依序向右移。,标志位:影响CF及OF。机器码:R
45、CL:|110100cw|mod 010 r/m|(if c=0 shift is 1;)RCR:|110100cw|mod 011 r/m|(if c=1 shift is in CL),*REP/REPE/REPZ/REPNE/REPNZ:重复字符串指令前缀 功能:按照指定次数重复字符串操作。这些前缀写在字符串指令CMPS、MOVS、SCAS及STOS前面。执行之前要先把次数放入CX,每执行字符串指令一次就把CX减1。使用REP时,字符串指令操作重复到CX=0为止。使用REPE/REPZ时,操作重复到CX=0或ZF=0为止。使用REPNE/REPNZ时,操作重复到CX=0或ZF=1为止。,
46、标志位:参阅相关字符串指令。机器码:REP/REPNE:11110010 REPE:11110011,*RET:子程序返回 功能:从稍前被CALL调用的子程序中返回。CALL可调用NEAR或FAR类型的子程序。当是NEAR的类型时,RET把栈顶的字弹出给IP,再把SP加2;当是FAR的类型时(即段间调用的返回),RET先把当前栈顶的字弹出给IP,然后SP加2,再把栈顶弹出给CS,SP加2。若RET包含数值操作数(例如,RET 4),弹出时这个值同时加给SP。,标志位:无影响。机器码:(4种格式)Within a segment:|11000011|Within a segment with p
47、op-value:|11000010|data-low|data-high|Intersegment:|11001011|Intersegment with pop-value:|11001010|data-low|data-high|,*ROL与ROR:不带进位的循环左移与右移 功能:向左或向右循环移动。此指令的操作对象可以是寄存器或内存单元的一个字节或字,并且可以向左或向右循环移动。若只移动1位,则可把操作数指定为1,若超过1位,循环移位就要把移位次数放在CL寄存器中。ROL循环左移,最左边(最高)的位进入第0位(最低位),其余各位依序向左移。ROR循环右移,第0位(最低位)进入最左边(最
48、高)的位,其余各位依序向右移。请参阅RCL及RCR。,标志位:影响CF及OF。机器码:ROL:|110100cw|mod 000 r/m|(if c=0 count=1;ROR:|110100cw|mod 001 r/m|if c=1 count is in CL),*SAHF:AH传送到标志寄存器 功能:把AH的内容传送到标志寄存器的低8位,该指令与8080处理器兼容。请参阅LAHF。SAHF指令AH可以改变标志寄存器低8位中的如下几个特定位:S Z*A*P*C(*表示没用到的位)标志位:影响AF、CF、PF、SF及ZF。机器码:10011110,*SAL、SAR、SHL及SHR:算术左移、
49、右移与逻辑左移、右移 功能:这类指令的操作对象可以是寄存器或内存单元的一个字节或字,并且可以向左或向右移动。若只移动1位,则把操作数指定为1,超过1位,就要在CL内存放移位次数。SAR是算术右移,它要考虑正负号(最高)位。SAR按照指定的次数,把各位向右移,最左边(最高)的正负号位保持不变。SHL和SHR是逻辑左移和逻辑右移,把正负号位当作数据位统一移位,把各位向左移或向右移,并把空出来的各位填上0。,SAL是算术左移,但作用与SHL相同。上述各种情况,被移出去的各位就丢掉了。标志位:影响CF、OF、PF、SF及ZF(AF不确定)。机器码:SAL/SHL:|110100cw|mod 100 r
50、/m|(if c=0 count=1;SAR:|110100cw|mod 111 r/m|if c=1 count in CL)SHR:|110100cw|mod 101 r/m|,*SBB:带借位减法 功能:通常用在多字节或多字的二进制减法中,使产生的借位继续参加下一阶段的计算。若CF标志被置1,则SBB首先把第一个操作数减1,然后SBB就像SUB一样,从第一个操作数中减掉第二个操作数。请参阅ADC。标志位:影响AF、CF、OF、PF、SF及ZF。,机器码:(3种格式)Reg/mem with reg:|000110dw|mod reg r/m|Immed from accum r:|000