80×86指令系统,指令按功能可分为以下7种:
- 数据传送指令.
- 算术运算指令.
- 逻辑运算指令.
- 串操作指令.
- 控制转移指令.
- 处理器控制指令.
- 保护方式指令.
数据传送指令
数据传送指令包括:通用数据传送指令、地址传送指令、标志传送指令、符号扩展指令、扩展传送指令等.
通用数据传送指令
- MOV: 传送1个字节,字或双字.
- PUSH: 把数据压入堆栈.
- PUSHA: 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
- PUSHAD: 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
- POP: 把数据弹出堆栈.
- POPA: 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
- POPAD: 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
- BSWAP: 交换32位寄存器里字节的顺序.
- XCHG: 交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)
- CMPXCHG: 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)
- XADD: 先交换再累加.(结果在第一个操作数里)
- XLAT: 字节查表转换.如BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)
扩展传送指令
- MOVSX: 先符号扩展,再传送.
- MOVZX: 先零扩展,再传送.
地址传送指令
- LEA: 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.
- LDS: 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
- LES: 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.
- LFS: 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
- LGS: 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
- LSS: 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
标志传送指令
- LAHF: 标志寄存器传送,把标志装入AH.
- SAHF: 标志寄存器传送,把AH内容装入标志寄存器.
- PUSHF: 标志入栈.
- POPF: 标志出栈.
- PUSHD: 32位标志入栈.
- POPD: 32位标志出栈.
符号扩展指令
- CBW: 将AL中8位带符号,进行带符号扩展为16位,送AX中.带符号扩展是指对正数高位扩展为全”0″,对负数高位扩展为全”1″.
- CWD: 将AX中16位带符号数,进行带符号扩展为32位,送DX和AX中.高16位送DX中,低16位送AX中.
- CWDE: 将AX中16位带符号数,进行带符号扩展为32位,送EAX中.
- CDQ: 将EAX中32位带符号数,进行带符号扩展为64位,送EDX和EAX中.低32位送EAX中,高32位送EDX中.
算术运算指令
- AAA: 将存放在AL中的二进制和数,调整为ASCII码表示的结果.AAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为AF,CF.其他标志位无定义.
- AAS: 将存放在AL中的二进制差数,调整为ASCII码表示形式.AAS指令一般紧跟在SUB,SBB指令之后使用,影响标志位为AF,CF.其他标志位无定义.
- AAM: 将存放在AL中的二进制积数,调整为ASCII码表示形式.AAM指令一般紧跟在MUL指令之后使用,影响标志位为SF,ZF,PF.其他标志位无定义.
- AAD: 将AX中两位非压缩BCD码(一个字节存放一位BCD码),转换为二进制数的表示形式.AAD指令用于二进制除法DIV操作之前,影响的标志位为SF,ZF,PF.其他标志位无定义.
- ADC: 带进位加法.
- ADD: 加法.
- INC: 加 1.
- DAA: 加法的十进制调整.
- SUB: 减法.
- SBB: 带借位减法.
- DEC: 减 1.
- NEG: 求反(以0减之).
- CMP: 比较.(两操作数作减法,仅修改标志位,不回送结果).
- DAS: 减法的十进制调整.
- MUL: 无符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算).
- IMUL: 整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算).
- DIV: 无符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).
- IDIV: 整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).
- CBW: 字节转换为字. (把AL中字节的符号扩展到AH中去)
- CWD: 字转换为双字. (把AX中的字的符号扩展到DX中去)
- CWDE: 字转换为双字. (把AX中的字符号扩展到EAX中去)
- CDQ: 双字扩展. (把EAX中的字的符号扩展到EDX中去)
逻辑运算指令
- AND: 与运算.
- OR: 或运算.
- XOR: 异或运算.
- NOT: 取反.
- TEST: 测试.(两操作数作与运算,仅修改标志位,不回送结果).
- SHL: 逻辑左移.
- SAL: 算术左移.
- SHR: 逻辑右移.
- SAR: 算术右移.
- ROL: 循环左移.
- ROR: 循环右移.
- RCL: 通过进位的循环左移.
- RCR: 通过进位的循环右移.
串指令
- MOVS: 串传送.( MOVSB传送字符. MOVSW 传送字. MOVSD 传送双字. )
- CMPS: 串比较.( CMPSB 比较字符. CMPSW 比较字. )
- SCAS: 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.
- LODS: 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
- STOS: 保存串.是LODS的逆过程.
- REP: 当CX/ECX<>0时重复.
- REPE/REPZ: 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
- REPNE/REPNZ: 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
- REPC: 当CF=1且CX/ECX<>0时重复.
- REPNC: 当CF=0且CX/ECX<>0时重复.
DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
控制转移指令
转移指令分长转移和短转移.无条件转移是长转移;条件转移是短转移,即-128到+127的距离内,当且仅当 (SF XOR OF)=1时,OP1<OP2
无条件转移指令(长转移):
- JMP: 无条件转移指令,同时修改CS:IP值.
- CALL: 过程调用.
- RET/RETF: 过程返回.
条件转移指令(短转移):
– JA/JNBE: 不小于或不等于时转移.
– JAE/JNB: 大于或等于转移.
– JB/JNAE: 小于转移.
– JBE/JNA: 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
- JG/JNLE: 大于转移.
- JGE/JNL: 大于或等于转移.
- JL/JNGE: 小于转移.
- JLE/JNG: 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
- JE/JZ: 等于转移.
- JNE/JNZ: 不等于时转移.
- JC: 有进位时转移.
- JNC: 无进位时转移.
- JNO: 不溢出时转移.
- JNP/JPO: 奇偶性为奇数时转移.
- JNS: 符号位为 “0” 时转移.
- JO: 溢出转移.
- JP/JPE: 奇偶性为偶数时转移.
- JS: 符号位为 “1” 时转移.
处理器控制指令
- HLT: 处理器暂停, 直到出现中断或复位信号才继续.
- WAIT: 当芯片引线TEST为高电平时使CPU进入等待状态.
- ESC: 转换到外处理器.
- LOCK: 封锁总线.
- NOP: 空操作.
- STC: 置进位标志位.
- CLC: 清进位标志位.
- CMC: 进位标志取反.
- STD: 置方向标志位.
- CLD: 清方向标志位.
- STI: 置中断允许位.
- CLI: 清中断允许位.
** 保护方式指令
- INT: 中断指令,指令包括中断操作码和中断类型码两部分,中断类型码n为8位,取值范围为0~255(00H~FFH).
- INTO: 溢出中断.
- IRET: 中断返回,弹出堆栈中数据送IP,CS,FLAGS.
- IRETD: 中断返回,弹出堆栈中数据送EIP,CS,EFLAGS.