pdf文件版:https://download.csdn.net/download/dzydzy7/11964407
指令 | DST | SRC | 用途 | 注意 | 对标志位影响 | |
数据传送指令 | MOV | reg/mem | imm | 立即数送寄存器或主存 | DST和SRC类型匹配(即8位对8位,16位对16位),DST不能是CS | 无 |
reg/mem/seg | reg | 寄存器送(段)寄存器或主存 | ||||
reg/seg | mem | 主存送(段)寄存器 | ||||
reg/mem | seg | 段寄存器送寄存器或主存 | ||||
XCHG | reg/mem | reg/mem | 交换DST和SRC的内容 | 不能mem和mem交换 | 无 | |
LEA | reg16 | mem | 装入mem的有效地址到reg16 | 无 | ||
LDS | reg16 | mem32 | 装入mem的有效地址的低字到reg16,高字到DS | 无 | ||
LES | reg16 | mem32 | 装入mem的有效地址的低字到reg16,高字到ES | 无 | ||
PUSH | reg16/reg32/mem16/mem32/seg/imm | 堆栈指针SP-2,再把一个字存入栈顶 | 操作数不能是CS | 无 | ||
POP | reg16/reg32/mem16/mem32/seg | 将栈顶的一个字传送至指定的目的操作数,堆栈指针SP+2 | 无 | |||
PUSHF | 标志寄存器进栈 | 无 | ||||
POPF | 标志寄存器出栈 | 以弹出至设置标志寄存器 | ||||
LAHF | AH = FLAGS的低8位 | 无 | ||||
SAFHF | FLAGS的低8位 = AH | 由新装入值(AH)确定 | ||||
CBW | AL符号扩展为AX | 无 | ||||
CWD | AX符号扩展为32位DX:AX | 无 | ||||
CWDE | AX符号扩展为EAX;386新增 | 无 | ||||
CDQ | EAX符号扩展为64位数EDX:EAX;386新增 | 无 | ||||
MOVSX | reg16 | reg8/mem8 | 是CBW、CWD和CWDE的一般形式,将8位数符号扩展为16或32位数,或者将16位数符号扩展为32位数。 | 无 | ||
reg32 | reg8/mem8/reg16/mem16 | 无 | ||||
MOVZX | reg32 | reg8/mem8/reg16/mem16 | 和MOVSX的区别是MOVZX是零扩展(补0),MOVSX是补符号位 | 无 | ||
XLAT | AL = DS:[BX + AL] | 无 | ||||
算术指令 | ADD | reg/mem | reg/mem/imm | DST = DST + SRC | ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数 | 影响CF、OF、SF、ZF |
ADC | reg/mem | reg/mem/imm | DST = DST + SRC + CF | 影响CF、OF、SF、ZF | ||
INC | reg/mem | DST = DST + 1 | 影响OF、SF、ZF | |||
SUB | reg/mem | reg/mem/imm | DST = DST - SRC | 2个操作数必须类型匹配,且不能同时是内存操作数 | 影响CF、OF、SF、ZF;CF表借位 | |
SBB | reg/mem | reg/mem/imm | DST = DST - SRC - CF | |||
CMP | reg/mem | reg/mem/imm | DST - SRC (不赋值) | |||
DEC | reg/mem | DST = DST - 1 | ||||
NEG | reg/mem | DST = 0 - DST | 不影响CF,其他同SUB | |||
MUL | reg8/mem8 | AX = AL * SRC | 无符号乘法 | 原来的位数能够容纳:CF = OF = 0,否则CF = OF = 1 | ||
reg16/mem16 | DX:AX = AX * SRC | |||||
reg32/mem32 | EDX:EAX = EAX * SRC | |||||
IMUL | reg8/mem8 | AX = AL * SRC | 带符号乘法 | 若结果的高一半为低一半的符号扩展,则CF = OF = 0,否则,CF = OF = 1 | ||
reg32/mem32 | DX:AX = AX * SRC | |||||
reg32/mem32 | EDX:EAX = EAX * SRC | |||||
DIV | reg8/mem8 | AL = AX / SRC; AH = AX % SRC | 无符号除法 | 无 | ||
reg16/mem16 | AX=DX:AX/SRC; DX=DX:AX/SRC | 无 | ||||
IDIV | reg8/mem8 | AL = AX / SRC; AH = AX % SRC | 有符号乘法 | 无 | ||
reg16/mem16 | AX=DX:AX/SRC; DX=DX:AX/SRC | 无 | ||||
DAA | 通常先执行ADD/ADC指令,将2个压缩BCD码相加,结果存放在AL中.然后使用该指令将AL调整为压缩BCD码格式. | OF不确定;CF反映压缩BCD码相加/相减的进位/借位状态;按一般规则影响SF和ZF。 | ||||
DAS | 通常先执行SUB/SBB指令,将2个压缩BCD码相减,结果存放在AL中.然后使用该指令将AL调整为压缩BCD码格式. | |||||
AAA | AL高4位 = 0,AH = AH + CF | 调整AL中的和为非压缩BCD码 | CF反映非压缩BCD码加/减的进位/借位;OF、SF和ZF不确定。 | |||
AAS | AL高4位 = 0,AH = AH - CF | 调整AL中的差为非压缩BCD码 | ||||
位操作指令 | AND | reg/mem | reg/mem/imm | 与 | CF = OF = 0,按一般规则影响SF和ZF。 | |
OR | reg/mem | reg/mem/imm | 或 | |||
XOR | reg/mem | reg/mem/imm | 异或 | |||
NOT | reg/mem | 非 | 无 | |||
TEST | reg/mem | reg/mem/imm | 对DST和SRC与,结果不回送到DST | TEST指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义 | ||
SHL | dest | count | 逻辑左移 | 若符号位发生了变化则OF=1否则OF=0。CF为最后移入位;不影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数 > 1,则OF无定义 | ||
SAL | ||||||
SHR | 逻辑右移(补0) | |||||
SAR | 逻辑右移(补符号位) | |||||
ROL | 循环左移,最高位给cf和最低位 | |||||
ROR | 循环右移,最低为给cf和最高位 | |||||
RCL | 最高位->cf cf->最低位(大循环 | |||||
RCR | 最低位->cf cf->最高位(大循环 | |||||
控制转移指令 | JMP | reg16/mem16 | 同一段,偏移为DST | 无 | ||
mem32 | 段地址=mem32高字,偏移=低字 | |||||
JZ/JE | ZF=1 跳转 | 判断的是单个标志位状态 | ||||
JNZ/JNE | ZF=0 跳转 | |||||
JS | SF=1 跳转 | |||||
JNS | SF=0 跳转 | |||||
JP/JPE | PF=1 跳转(奇数) | |||||
JNP/JPO | PF=0 跳转(偶数) | |||||
JO | OF=1 跳转 | |||||
JNO | OF=0 跳转 | |||||
JC | CF=1 跳转 | |||||
JNC | CF=0 跳转 | |||||
JB/JNAE | CF=1(有借位) | 比较无符号数高低 | 无 | |||
JNB/JAE | CF=0(无借位) | |||||
JBE/JNA | CF=1orZF=1(有借位或结果为0) | |||||
JNBE/JA | CF=0orZF=0(无借位或结果非0) | |||||
JL/JNGE | SF!=OF | 比较有符号数大小 | 无 | |||
JNL/JGE | SF==OF | |||||
JLE/JNG | SF!=OF or ZF==1 | |||||
JNLE/JG | SF==OF or ZF==0 | |||||
JCXZ | label | CX=0转移到label | label相对位移量必须在-128 ~ 127之间 | 无 | ||
JCEXZ | label | ECX=0转移到label | ||||
LOOP | label | CX = CX – 1,若CX ≠ 0,则转移到label | 无 | |||
LOOPZ/LOOPE | lable | CX = CX – 1,若CX ≠ 0且ZF=1,则转移到label | ||||
LOOPNZ/LOOPNE | label | CX = CX – 1,若CX ≠ 0且ZF=0,则转移到label | ||||
串操作指令 | MOVSB | 字节传送:ES:[DI]←DS:[SI] SI←SI±1,DI←DI±1 | ||||
MOVSW | 字串传送:ES:[DI]←DS:[SI] SI←SI±2,DI←DI±2 | |||||
STOSB | 字节串存储:ES:[DI]←AL DI←DI±1 | |||||
STOSW | 字串存储:ES:[DI]←AX DI←DI±2 | |||||
LODSB | 字节串读取:AL←DS:[SI] SI←SI±1 | |||||
LODSW | 字串读取:AX←DS:[SI] SI←SI±2 | |||||
CMPSB | 字节串比较:DS:[SI]-ES:[DI] SI←SI±1,DI←DI±1 | 改变ZF,可表示是否相等 | ||||
CMPSW | 字串比较:DS:[SI]-ES:[DI] SI←SI±2,DI←DI±2 | |||||
SCASB | 字节串扫描:AL-ES:[DI] DI←DI±1 | 改变ZF,可表示是否和AL相等 | ||||
SCASW | 字串扫描:AX-ES:[DI] DI←DI±2 | |||||
重复前缀指令 | REP | 当CX ≠ 0时,重复执行后面的串指令,每执行1次,CX=CX–1只能用在MOVS、LODS或STOS之前 | ||||
REPZ/REPE | 当CX≠0且ZF=1时,重复执行后面的串指令,每执行1次,CX=CX-1,只能用在CMPS或SCAS之前 | |||||
系统功能调用 | INT 21H | 根据AH给出功能号,执行对应功能 | ||||
AH | 功能 | 入口参数 | ||||
01H | 从键盘读入一个字符 | AL=输入字符的ASCII码 | ||||
02H | 显示一个字符 | DL=字符的ASCII码 | ||||
09H | 显示一个字符串 | DS:DX=字符串首地址,字符串必须以$(24H)结束 | ||||
0Ah | 从键盘读入一个字符串 | 读字符串,存入DS:DX所指的缓冲区Ctrl+C中止 | ||||
标志处理指令 | CLC | CF清0 | ||||
STC | CF置1 | |||||
CMC | CF取反 | |||||
CLD | DF清0 | |||||
STD | DF置1 | |||||
CLI | 关中断 | |||||
STI | 开中断 | |||||
处理器控制指令 | NOP | 无操作 | ||||
HLT | 暂停 |