文章最后更新时间为:2018年12月29日 21:00:19
本文总结的汇编语言是针对IA-32处理器也就是X86体系结构的32位版本。但是在不同的体系结构中,汇编语句大同小异。
1.传送指令
指令 | 解释 |
---|
MOV DESC,SRC | 传送指令,SESC <= SRC |
XCHG OPRD1,OPRD2 | 交换指令,将OPRD1,OPRD2内容互换 |
PUSH | 压栈 |
POP | 出栈 |
PUSHA | 16个寄存器全进栈 |
POPA | 将16个寄存器全出栈 |
PUSHAD | 32个通用寄存器全进栈 |
POPAD | 32个通用寄存器全出栈 |
2.算术运算指令
指令 | 解释 |
---|
ADD DESC,SRC | 加法指令,DESC <= DESC+SRC |
ADC DEST,SRC | 带进位加法指令,DESC <= DESC+SRC+CF |
SUB DESC,SRC | 减法指令,DESC <= DESC-SRC |
SBB DESC,SRC | 带错位减法指令,DESC <=DESC-(SRC+CF) |
INC DEST | 加1指令,DEST <= DEST+1 |
DEC DEST | 减一指令DEST <= DEST-1 |
NEG OPED | 取补指令,OPRE <= 0-OPRD |
MUL OPRD | 无符号数乘法 |
IMUL OPRD | 有符号数乘法 |
DIV OPRD | 无符号数除法 |
IDIV OPRD | 有符号数除法 |
3.逻辑与位运算指令
指令 | 解释 |
---|
CWD/CWDE | 字转换为双字指令,符号扩展 |
CDQ | 双字转换为四字指令 |
MOVSX DEST,SRC | 符号扩展传送指令,将SRC符号扩展后送至DEST |
MOVZX DEST,SRC | 零扩展传送指令,将SRC零扩展后送至DEST |
NOT OPRD | 按位取反 |
AND DEST,SRC | 按位与送到DEST |
OR DEST,SRC | 按位或送到DEST |
XOR DEST,SRC | 按位异或送到DEST |
TEST DESC,SRC | 按位与,但是不送到DEST,仅影响状态标志 |
SAL/SHL OPRD count | 算术左移/逻辑左移(同) |
SAR/SHR OPRD count | 算术右移/逻辑右移(同) |
ROL OPRD count | 循环左移 |
ROR OPRD count | 循环右移 |
RCL OPRD count | 带进位循环左移 |
RCR OPRD count | 带进位循环右移 |
SHLD OPRD1,OPRD2,count | 双精度左移 |
SHRD OPRD1,OPRD2,count | 双精度右移 |
4.状态标志操作指令
从最早的Inter 8086 CPU开始,就有6个状态标志,这六个状态标志分别是进位标志CF、零状态标志ZF、符号标志SF、溢出标志OF、奇偶标志PF和辅助进位标志AF。
下面简单介绍一下六个进位标志的作用。
- 进位标志主要反映算术运算是否产生进位或者借位。
- 零标志反映运算结果是否为0
- 符号标志反映运算结果的符号位
- 溢出标志反映有符号数加减是否引起溢出
- 奇偶标志反映运算结果的最低字节中含有1的位数是奇数还是偶数
- 辅助进位标志反映算术运算中第三位是否产生进位或者错位
指令 | 解释 |
---|
CLC | 清进位标志指令,使进位标志CF为0 |
STC | 置进位标志指令,使进位标志CF为1 |
CMC | 进位标志指令取反指令,使进位标志CF取反 |
LAHF | 获取状态标志操作,把标志寄存器的低八位送到通用寄存器AH中 |
SAHF | 设置标志状态操作指令,使得状态标志SF、ZF、AF、PF和CF分别成为来自寄存器AH中对应位的值 |
5.条件转移指令
指令格式 | 解释 |
---|
JZ/JE | 相等转移 |
JNZ/JNE | 不相等转移 |
JS | 为负转移 |
JNS | 为正转移 |
JO | 溢出转移 |
JNO | 不溢出转移 |
JP/JPE | 偶转移 |
JNP/JPO | 奇转移 |
JB/JNAE/JC | 低于转移 |
JNB/JAE/JNC | 不低于转移 |
JBE/JNA | 不高于转移 |
JNBE/JA | 高于转移 |
JL/JNGE | 小于转移 |
JNL/JGE | 不小于转移 |
JLE/JNG | 不大于转移 |
JNLE/JG | 大于转移 |
JCXZ | 计数器CX为0转移 |
JECXZ | 计数器ECX为0转移 |
6.比较指令
指令 | 解释 |
---|
CMP DEST,SRC | 根据DESC和SRC的差来将结果送到标志寄存器,但是不把结果的差送到DEST |
7.过程调用和返回指令
指令 | 解释 |
---|
CALL LABEL | 调用指令 |
RET | 返回指令 |
8.字符串操作与位操作
指令 | 解释 |
---|
LODSB/LODSW/LODSD | 装入字节(byte)/字(word)/双字(double word) |
STOSB/STOSW/STOSD | 存储字节/字/双字 |
MOVSB/MOVSW/MOVSD | 传送字节/字/双字 |
SCASB/SCASW/SCASD | 扫描字节/字/双字 |
CMPSB/CMPSW/CMPSD | 比较字节/字/双字 |
BT OPRD1,OPRD2 | 把被测试位的值送到进位标志CF,并且把被测试位取反 |
BTC OPRD1,OPRD2 | 把被测试位的值送到进位标志CF,并且把被测试位清0 |
BTR OPRD1,OPRD2 | 把被测试位的值送到进位标志CF,并且把被测试位置1 |
BSF OPRD1,OPRD2 | (OPRD1为通用寄存器,OPRD2为通用寄存器或者存储单元)从右向左扫描字或者双字操作数OPRD2中第一个含1的位,并把扫描到的第一个位的位号送到操作数OPRD1,如果OPRD2为0,那么置ZF为1,否则将ZF清0 |
BSR OPRD1,OPRD2 | 同上,扫描顺序为从左到右 |
参考