一、常用寄存器(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 | 小于等于则转移 |
参考博客:
(4条消息) 汇编指令详解_oucheng_的博客-CSDN博客_汇编指令
汇编指令入门,你应该了解这些指令 - 知乎 (zhihu.com)
操作系统原理:汇编语言的所有指令总结,一篇就够了 - 知乎 (zhihu.com)
(4条消息) 汇编中的标志寄存器_了不起的盖茨比。的博客-CSDN博客_汇编标志寄存器
|