首页 > 编程学习 > 常用汇编指令介绍

常用汇编指令介绍

发布时间:2022/10/1 8:50:49

一、常用寄存器(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,srcdest = 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,oprd2oprd1 =  oprd1-oprd2
INC加1操作inc oprdoprd = oprd+1
DEC减1操作dec oprdoprd = oprd-1
NEG取反指令neg oprdoprd = -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,oprd2oprd1 = oprd1 按位逻辑与 oprd2
OR或运算指令or oprd1,oprd2oprd1 = oprd1 按位逻辑或 oprd2
XOR异或运算指令xor oprd1,oprd2oprd1 = 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等于则转移
JNEjne label不等于则转移
JB条件转移指令jb label小于则转移
JNBjnb label不小于则转移
JA条件转移指令ja label大于则转移
JNAjnbe label不大于则转移
JBE条件转移指令jbe label小于等于则转移

参考博客:

(4条消息) 汇编指令详解_oucheng_的博客-CSDN博客_汇编指令

汇编指令入门,你应该了解这些指令 - 知乎 (zhihu.com)

操作系统原理:汇编语言的所有指令总结,一篇就够了 - 知乎 (zhihu.com)

(4条消息) 汇编中的标志寄存器_了不起的盖茨比。的博客-CSDN博客_汇编标志寄存器

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号