常用汇编指令

本文整理了常用的汇编指令,包括串指令、伪指令、数据传输指令、程序转移指令、算数运算指令和逻辑运算指令,详细描述了每种指令的功能和使用方法,适合学习编译原理的参考。

type
status
date
slug
summary
tags
category
icon
password
最近正好在学习编译原理,为方便记忆,上网找了一些常用的指令并整理下来

串指令

Register
Description
Additional Information
DS:SI
源串段寄存器 : 源串变址
ES:DI
目标串段寄存器: 目标串变址
CX
重复次数计数器
AL/AX
扫描值
D标志
控制增量或减量
0表示自动增量; 1表示自动减量
Z标志
控制扫描或比较操作的结束
MOVS
串传送
MOVSB: 传送字符, MOVSW: 传送字, MOVSD: 传送双字
CMPS
串比较
CMPSB: 比较字符, CMPSW: 比较字
SCAS
串扫描
比较AL或AX的内容与目标串,结果反映在标志位
LODS
装入串
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条件)
当CF=1且CX/ECX≠0时重复
REPNC
重复操作(CF=0条件)
当CF=0且CX/ECX≠0时重复

伪指令

Directive
Description
Note
DW
定义字 (2字节)
PROC
定义过程
ENDP
过程结束
SEGMENT
定义段
ASSUME
建立段寄存器寻址
ENDS
段结束
END
程序结束

数据传输指令

数据传输指令用于在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
  1. 通用数据传送指令
    1. Instruction
      Description
      Additional Information
      MOV
      传送字或字节
      MOVSX
      先符号扩展, 再传送
      MOVZX
      先零扩展, 再传送
      PUSH
      把字压入堆栈
      POP
      把字弹出堆栈
      PUSHA
      把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈
      POPA
      把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈
      PUSHAD
      把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈
      POPAD
      把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
      BSWAP
      交换32位寄存器里字节的顺序
      XCHG
      交换字或字节
      至少有一个操作数为寄存器,段寄存器不可作为操作数
      CMPXCHG
      比较并交换操作数
      第二个操作数必须为累加器AL/AX/EAX
      XADD
      先交换再累加
      结果在第一个操作数里
      XLAT
      字节查表转换
      BX指向一张256字节的表的起点, AL为表索引; [BX+AL]->AL
  1. 输入输出端口传送指令
    1. Instruction
      Description
      Syntax
      Additional Information
      IN
      I/O端口输入
      IN 累加器, {端口号|DX}
      立即方式指定端口时范围是 0-255; 寄存器DX指定时范围是 0-65535
      OUT
      I/O端口输出
      OUT {端口号|DX}, 累加器
      立即方式指定端口时范围是 0-255; 寄存器DX指定时范围是 0-65535
  1. 目的地址传送指令
    1. Instruction
      Description
      Example
      Note
      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
  1. 标志传送指令
    1. Instruction
      Description
      Note
      LAHF
      标志寄存器传送, 把标志装入AH
      SAHF
      标志寄存器传送, 把AH内容装入标志寄存器
      PUSHF
      标志入栈
      POPF
      标志出栈
      PUSHD
      32位标志入栈
      POPD
      32位标志出栈

程序转移指令

  1. 无条件转移指令 (长转移)
    1. Instruction
      Description
      Note
      JMP
      无条件转移指令
      CALL
      过程调用
      RET
      过程返回
      RET for near return
      RETF
      过程返回
      RETF for far return
  1. 条件转移指令 (短转移,-128到+127的距离内)
    1. ( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
      Instruction
      Description
      Note
      JA/JNBE
      不小于或不等于时转移
      用于无符号整数, 测试C和Z标志
      JAE/JNB
      大于或等于转移
      用于无符号整数, 测试C和Z标志
      JB/JNAE
      小于转移
      用于无符号整数, 测试C和Z标志
      JBE/JNA
      小于或等于转移
      用于无符号整数, 测试C和Z标志
      JG/JNLE
      大于转移
      用于带符号整数, 测试S, O和Z标志
      JGE/JNL
      大于或等于转移
      用于带符号整数, 测试S, O和Z标志
      JL/JNGE
      小于转移
      用于带符号整数, 测试S, O和Z标志
      JLE/JNG
      小于或等于转移
      用于带符号整数, 测试S, O和Z标志
      JE/JZ
      等于转移
      JNE/JNZ
      不等于时转移
      JC
      有进位时转移
      JNC
      无进位时转移
      JNO
      不溢出时转移
      JNP/JPO
      奇偶性为奇数时转移
      JNS
      符号位为 “0″ 时转移
      JO
      溢出转移
      JP/JPE
      奇偶性为偶数时转移
      JS
      符号位为 “1″ 时转移
  1. 循环控制指令(短转移)
    1. Instruction
      Description
      Note
      LOOP
      CX不为零时循环
      LOOPE/LOOPZ
      CX不为零且标志Z=1时循环
      LOOPNE/LOOPNZ
      CX不为零且标志Z=0时循环
      JCXZ
      CX为零时转移
      JECXZ
      ECX为零时转移
  1. 中断指令
    1. Instruction
      Description
      Note
      INT
      中断指令
      INTO
      溢出中断
      当OF标志位为1时触发
      IRET
      中断返回
  1. 处理器控制指令
    1. Instruction
      Description
      Note
      HLT
      处理器暂停
      直到出现中断或复位信号才继续
      WAIT
      CPU进入等待状态
      当芯片引线TEST为高电平时触发
      ESC
      转换到外处理器
      LOCK
      封锁总线
      NOP
      空操作
      STC
      置进位标志位
      CLC
      清进位标志位
      CMC
      进位标志取反
      STD
      置方向标志位
      CLD
      清方向标志位
      STI
      置中断允许位
      CLI
      清中断允许位

算数运算指令

Instruction
Description
Note
DD
加法
ADC
带进位加法
INC
加 1
AAA
加法的ASCII码调整
DAA
加法的十进制调整
SUB
减法
SBB
带借位减法
DEC
减 1
NEC
求反 (以 0 减之)
CMP
比较
两操作数作减法, 仅修改标志位, 不回送结果
AAS
减法的ASCII码调整
DAS
减法的十进制调整
MUL
无符号乘法
结果回送AH和AL或DX和AX
IMUL
整数乘法
结果回送AH和AL或DX和AX
AAM
乘法的ASCII码调整
DIV
无符号除法
结果回送商和余数
IDIV
整数除法
结果回送商和余数
AAD
除法的ASCII码调整
CBW
字节转换为字
把AL中字节的符号扩展到AH中
CWD
字转换为双字
把AX中的字的符号扩展到DX中
CWDE
字转换为双字
把AX中的字符号扩展到EAX中
CDQ
双字扩展
把EAX中的字的符号扩展到EDX中

逻辑运算指令

Instruction
Description
Note
AND
与运算
OR
或运算
XOR
异或运算
NOT
取反
TEST
测试
两操作数作与运算, 仅修改标志位, 不回送结果
SHL
逻辑左移
可达255次移位, 移位次数可由CL寄存器给出
SAL
算术左移 (等同于SHL)
可达255次移位, 移位次数可由CL寄存器给出
SHR
逻辑右移
可达255次移位, 移位次数可由CL寄存器给出
SAR
算术右移 (等同于SHR)
可达255次移位, 移位次数可由CL寄存器给出
ROL
循环左移
可达255次移位, 移位次数可由CL寄存器给出
ROR
循环右移
可达255次移位, 移位次数可由CL寄存器给出
RCL
通过进位的循环左移
可达255次移位, 移位次数可由CL寄存器给出
RCR
通过进位的循环右移
可达255次移位, 移位次数可由CL寄存器给出
 
Loading...