汇编-指令的基本操作

80×86指令系统,指令按功能可分为以下7种:

  1. 数据传送指令.
  2. 算术运算指令.
  3. 逻辑运算指令.
  4. 串操作指令.
  5. 控制转移指令.
  6. 处理器控制指令.
  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.