一、常用寄存器(64位)
寄存器 | 名称 | 用途 |
RAX | 累加寄存器(Accumulator) | 常用于乘、除法和函数返回值 |
RBX | 基址寄存器 (Base) | 常做内存数据的指针,以它为基址来访问内存 |
RCX | 计数器寄存器(Counter) | 常做字符串和循环操作中的计数器 |
RDX | 数据寄存器(Data) | 常用于乘、除法和I/O指针 |
RSI | 来源索引寄存器(Source Index) | 常做内存数据指针和源字符串指针 |
RDI | 目的索引寄存器(Destination Index) | 常做内存数据指针和目的字符串指针 |
RSP | 堆栈指针寄存器(Stack Point) | 只做堆栈的栈顶指针,不能用于算术运算和数据传送 |
RBP | 基址指针寄存器(Base Point) | 只做堆栈指针,可以访问堆栈内任意地址,经常用于中转ESP中的数据,也常以它为基址来访问堆栈,不能用于算术运算与数据传送 |
RIP | 程序指令寄存器(Instruction Point) | 指向下一条待执行指令的地址 |
R8/R9 | --- | 64位新增加的寄存器,用于函数参数 |
R10/R11/R12 /R13/R14/R15 | --- | 64位新增加的寄存器,用于数据存储 |
段寄存器 | 标志寄存器 |
CS:code segment 代码段寄存器 DS:data segment 数据段寄存器 SS:stack segment 堆栈段寄存器 ES:extra segment 附加段寄存器 | ZF:零标志位 PF:奇偶标志位 SF:符号标志位 CF:进位标志位 OF:溢出标志位 |
//RAX、EAX、AX、AH、AL是同一个寄存器,区别在于表示的范围不一样
//RAX:64位寄存器,EAX:32位寄存器,AX:16位,AH:高8位,AL:低8位
|63..32|31..16|15-8|7-0|
|AH.|AL.|
|AX.....|
|EAX............|
|RAX...................|
二、数据传送指令
指令 | 名称 | 用法 | 备注 | |
MOV | 传送指令 | mov dest,src | dest = src,传送字或字节 | |
movsx dest,src | 先符号扩展,再传送 | |||
movzx dest,src | 先零扩展,再传送 | |||
PUSH | 进栈指令 | push src | 把源操作数src压入堆栈 | |
POP | 出栈指令 | pop dest | 从栈顶弹出字数据到dest | |
LEA/LDS/LES | 地址传送指令 | lea reg,oprd | 将操作数oprd的有效地址传送到16位寄存器reg,如lea ax,[si+2] | |
lds reg,oprd | 把操作数OPRD存储的32位数据的高16位(段地址)送至DS,低16位(偏移地址)送至16位寄存器REG | |||
les reg,oprd | 把操作数OPRD存储的32位数据的高16位(段地址)送至ES,低16位(偏移地址)送至16位寄存器REG |
三、算术运算指令
指令 | 名称 | 用法 | 备注 | |
ADD | 加法指令 | add oprd1,oprd2 | oprd1 = oprd1+oprd2 | |
adc oprd1,oprd2 | 带进位的加法,oprd1 = oprd1+oprd2+CF | |||
SUB | 减法指令 | sub oprd1,oprd2 | oprd1 = oprd1-oprd2 | |
INC | 加1操作 | inc oprd | oprd = oprd+1 | |
DEC | 减1操作 | dec oprd | oprd = oprd-1 | |
NEG | 取反指令 | neg oprd | oprd = -oprd | |
CMP | 比较指令 | cmp oprd1,oprd2 | 计算oprd1-oprd2,结果不传送给oprd1,根据比较结果进行后续的跳转 | |
MUL | 乘法指令 | mul oprd | 无符号乘法,将OPRD与AX(16位)或AL(8位)中的操作数相乘,结果保存在DX:AX(高16位+低16位)中或AX(16位)中 | |
imul oprd | 有符号乘法,将OPRD与AX(16位)或AL(8位)中的操作数相乘,结果保存在DX:AX(高16位+低16位)中或AX(16位)中 | |||
DIV | 除法指令 | div oprd | 无符号除法,OPRD为除数,被除数为AX(16位)或AL(8位)中的操作数,结果保存在DX:AX(高16位+低16位)中或AX(16位)中 | |
idiv oprd | 有符号除法,OPRD为除数,被除数为AX(16位)或AL(8位)中的操作数,结果保存在DX:AX(高16位+低16位)中或AX(16位)中 | |||
CBW/CWB | 符号扩展指令 | cbw | 把寄存器AL中的符号位扩展到寄存器AH(8位) | |
cwb | 把寄存器AX中的符号位扩展到寄存器DX(16位) |
四、逻辑运算和移位指令
指令 | 名称 | 用法 | 备注 | |
NOT | 取反运算指令 | not oprd | 把操作数oprd按位取反,然后送回oprd | |
AND | 与运算指令 | and oprd1,oprd2 | oprd1 = oprd1 按位逻辑与 oprd2 | |
OR | 或运算指令 | or oprd1,oprd2 | oprd1 = oprd1 按位逻辑或 oprd2 | |
XOR | 异或运算指令 | xor oprd1,oprd2 | oprd1 = oprd1 按位逻辑异或 oprd2 | |
TEST | 检验指令 | test oprd1,oprd2 | 把oprd1与oprd2按位“与”,但结果不送到oprd1中,仅影响标志位。 | |
SAL/SHL | 左移运算指令 | sal oprd,m | 算术左移,把操作数oprd左移m位,每移动一位,右边用0补足1位,移出的最高位进入标志位CF | |
shl oprd,m | 逻辑左移,把操作数oprd左移m位,每移动一位,右边用0补足1位,移出的最高位进入标志位CF | |||
SAR/SHR | 右移运算指令 | sar oprd,m | 算术右移,操作数右移m位,同时每移1位,左边的符号位保持不变,移出的最低位进入标志位CF | |
shr oprd,m | 逻辑左移,操作数右移m位,同时每移1位,左边用0补足,移出的最低位进入标志位CF |
五、循环控制和转移指令
指令 | 名称 | 用法 | 备注 | |
LOOP | 计数循环指令 | loop label | 使ecx的值减1,当ecx的值不为0的时候跳转到label,否则执行loop之后的语句 | |
JMP | 无条件转移指令 | jmp label | 无条件转移到标号为label的位置 | |
CALL | 过程调用指令 | call label | 直接调用label | |
RET | 过程返回指令 | ret | 调用ret后,会有pop rip操作,即:rsp弹出一个字的数据,然后作为rip的值,成为函数返回地址 | |
JE | 条件转移指令 | je label | 等于则转移 | |
JNE | jne label | 不等于则转移 | ||
JB | 条件转移指令 | jb label | 小于则转移 | |
JNB | jnb label | 不小于则转移 | ||
JA | 条件转移指令 | ja label | 大于则转移 | |
JNA | jnbe label | 不大于则转移 | ||
JBE | 条件转移指令 | jbe label | 小于等于则转移 |
六、读/写指令
指令 | 名称 | 用法 | 备注 | |
in | 读指令 | in al,dx | 将地址dx处的值读入al | |
out | 写指令 | out dx,al | 将值al写入地址dx处 |
参考博客:
(4条消息) 汇编指令详解_oucheng_的博客-CSDN博客_汇编指令
汇编指令入门,你应该了解这些指令 - 知乎 (zhihu.com)