常用汇编指令
本文整理了常用的汇编指令,包括串指令、伪指令、数据传输指令、程序转移指令、算数运算指令和逻辑运算指令,详细描述了每种指令的功能和使用方法,适合学习编译原理的参考。
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 | 程序结束 | ㅤ |
数据传输指令
数据传输指令用于在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
- 通用数据传送指令
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 |
- 输入输出端口传送指令
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 |
- 目的地址传送指令
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 |
- 标志传送指令
Instruction | Description | Note |
LAHF | 标志寄存器传送, 把标志装入AH | ㅤ |
SAHF | 标志寄存器传送, 把AH内容装入标志寄存器 | ㅤ |
PUSHF | 标志入栈 | ㅤ |
POPF | 标志出栈 | ㅤ |
PUSHD | 32位标志入栈 | ㅤ |
POPD | 32位标志出栈 | ㅤ |
程序转移指令
- 无条件转移指令 (长转移)
Instruction | Description | Note |
JMP | 无条件转移指令 | ㅤ |
CALL | 过程调用 | ㅤ |
RET | 过程返回 | RET for near return |
RETF | 过程返回 | RETF for far return |
- 条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(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″ 时转移 | ㅤ |
- 循环控制指令(短转移)
Instruction | Description | Note |
LOOP | CX不为零时循环 | ㅤ |
LOOPE/LOOPZ | CX不为零且标志Z=1时循环 | ㅤ |
LOOPNE/LOOPNZ | CX不为零且标志Z=0时循环 | ㅤ |
JCXZ | CX为零时转移 | ㅤ |
JECXZ | ECX为零时转移 | ㅤ |
- 中断指令
Instruction | Description | Note |
INT | 中断指令 | ㅤ |
INTO | 溢出中断 | 当OF标志位为1时触发 |
IRET | 中断返回 | ㅤ |
- 处理器控制指令
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...