• 常用汇编指令介绍


    一、常用寄存器(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:溢出标志位

    1. //RAX、EAX、AX、AH、AL是同一个寄存器,区别在于表示的范围不一样
    2. //RAX:64位寄存器,EAX:32位寄存器,AX:16位,AH:高8位,AL:低8位
    3. |63..32|31..16|15-8|7-0|
    4. |AH.|AL.|
    5. |AX.....|
    6. |EAX............|
    7. |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小于等于则转移

    六、读/写指令

    指令名称用法备注
    in读指令in al,dx将地址dx处的值读入al
    out写指令

    out dx,al

    将值al写入地址dx处

    参考博客:

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

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

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

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

  • 相关阅读:
    简述 happens - before 八大规则
    numpy.unique
    浅谈 kafka
    Scrapy使用GitHub上的ProxyPool代理池
    CSS学习笔记目录
    DT 卡通材质学习 一
    【项目管理】原则之四--聚焦于价值
    RabbitMQ常见问题及其解决方案
    百度地图高级进阶开发:圆形区域周边搜索地图监听事件(覆盖物重叠显示层级\图像标注监听事件、setZIndex和setTop方法)
    前端经典面试题 | 性能优化之图片优化
  • 原文地址:https://blog.csdn.net/m0_37865160/article/details/127118527