X86架构基本汇编指令详解

2023-05-16

文章目录

  • 汇编指令
      • 伪指令
        • 1. .MODEL
        • 2. .STACK
        • 3. ENDP
        • 4. END
      • 汇编指令
        • 1. MOV:将源操作数复制到目的操作数
        • 2. MOVZX 和 MOVSX
        • 3. XCHG:交换两个操作数内容
        • 4. INC 和 DEC
        • 5. ADD 和 SUB:操作数相加减;
        • 6. NEG: NEG(非)指令通过把操作数转换为其二进制补码,将操作数的符号取反;
        • 7. ALIGN伪指令:对齐一个变量
        • 8. JMP指令
        • 9. LOOP指令
        • 10. PUSH,POP指令
        • 11. PUSHFD,POPFD指令
        • 12. PUSHAD, PUSHA, POPAD, POPA
        • 13. CALL和RET指令
        • 14. AND,OR, XOR, NOT 指令
        • 15. TEST指令:对两个操作数进行按位与操作
        • 16. CMP指令:比较整数
        • 17. 跳转指令
        • 18. 移位和循环移位指令
        • 19. MUL指令:无符号乘法
        • 20. IMUL指令:有符号乘法
        • 21. DIV指令:无符号除法
        • 22. IDICV:有符号除法
        • 23. LEA:返回间接操作数的地址

汇编指令

伪指令

1. .MODEL

.model flat,stdcall

model伪指令告诉汇编程序使用哪一种存储模式:32 位程序总是使用平面(flat)存储模式,它与处理器的保护模式相关联。关键字 stdcall 在调用程序时告诉汇编器,怎样管理运行时堆栈。
然后是 .STACK 伪指令,它告诉汇编器应该为程序运行时堆栈保留多少内存字节。

2. .STACK

.stack 4096

数值 4096 可能比将要用的字节数多,但是对处理器的内存管理而言,它正好对应了一个内存页的大小。所有的现代程序在调用子程序时都会用到堆栈。首先,用来保存传递的参数;
其次,用来保存调用函数的代码的地址。

3. ENDP

main ENDP

ENDP 伪指令标记一个过程的结束。如果程序有名为 main 的过程,则 endp 就必须使用同样的名称;

4. END

END main

最后,END 伪指令标记一个程序的结束,并要引用程序入口;

汇编指令

1. MOV:将源操作数复制到目的操作数

MOV 指令将源操作数复制到目的操作数。作为数据传送(data transfer)指令,它几乎用在所有程序中。在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数:

MOV destination, sourece

两个操作数必须是同样的大小。
两个操作数不能同时为内存操作数。
指令指针寄存器(IP、EIP 或 RIP)不能作为目标操作数。

MOV指令不能直接将较小的操作数复制到较大的操作数中

2. MOVZX 和 MOVSX

MOVZX 指令(进行全零扩展并传送)将源操作数复制到目的操作数,并把目的操作数 0 扩展到 16 位或 32 位。这条指令只用于无符号整数,有三种不同的形式;

MOVZX reg32,reg/mem8
MOVZX reg32,reg/mem16
MOVZX reg16,reg/mem8

MOVSX 指令(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号扩展到 16 位或 32 位。这条指令只用于有符号整数,有三种不同的形式;

MOVSX reg32, reg/mem8
MOVSX reg32, reg/mem16
MOVSX reg16, reg/mem8

3. XCHG:交换两个操作数内容

三种格式:

XCHG reg, reg
XCHG reg, mem
XCHG mem, reg

不能直接交换两个内存操作数

4. INC 和 DEC

INC(增加)和DEC(减少)指令分别表示寄存器加 1 和减 1:

INC reg/mem
DEC reg/mem

不支持直接对内存进行操作

5. ADD 和 SUB:操作数相加减;

6. NEG: NEG(非)指令通过把操作数转换为其二进制补码,将操作数的符号取反;

NEG reg
NEG mem

将目标操作数按位取反再加 1,就可以得到这个数的二进制补码。

7. ALIGN伪指令:对齐一个变量

ALIGN 伪指令将一个变量对齐到字节边界、字边界、双字边界或段落边界。

ALIGN bound

ALIGN 4     ;偏移量按4对齐

8. JMP指令

JMP 指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量。

JMP destination

当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。

无限循环

top:
    .
    .
    jmp top

9. LOOP指令

LOOP 指令,正式称为按照 ECX 计数器循环,将程序块重复特定次数。ECX 自动成为计数器,每循环一次计数值减 1。
循环目标必须距离当前地址计数器 -128 到 +127 字节范围内。LOOP 指令的执行有两个步骤:

  • 第一步,ECX 减 1。
  • 第二步,将 ECX 与 0 比较。

当ECX不等于0,则跳转到符号内容中; 若ECX不等于0,则不发生跳转。

    ; 每次循环将AX加1,当循环结束,AX=5,ECX=0
    MOV AX, 0
    MOV ECX, 5
L1:
    INC AX
    LOOP L1

10. PUSH,POP指令

PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。

PUSH reg/mem16
PUSH reg/mem32
PUSH inm32

POP 指令首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数中,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4。

POP reg/mem16
POP reg/mem32

11. PUSHFD,POPFD指令

PUSHFD 指令把 32 位 EFLAGS 寄存器内容压入堆栈,而 POPFD 指令则把栈顶单元内容弹出到 EFLAGS 寄存器。

PUSHFD          ;保持标志寄存器
POPFD           ;恢复标志寄存器

12. PUSHAD, PUSHA, POPAD, POPA

  • PUSHAD 指令按照 EAX、ECX、EDX、EBX、ESP、EBP、ESI 和 EDI 的顺序(执行 PUSHAD 之前的值),将所有 32 位通用寄存器压入堆栈;POPAD 指令按照相反顺序将同样的寄存器弹出堆栈。
  • PUSHA 指令按序(AX、CX、DX、BX、SP、BP、SI 和 DI)将 16 位通用寄存器压入堆栈;POPA 指令按照相反顺序将同样的寄存器弹出堆栈。

13. CALL和RET指令

CALL 指令调用一个过程,指挥处理器从新的内存地址开始执行。过程使用 RET(从过程返回)指令将处理器转回到该过程被调用的程序点上。
从物理上来说,CALL 指令将其返回地址压入堆栈,再把被调用过程的地址复制到指令指针寄存器。当过程准备返回时,它的 RET 指令从堆栈把返回地址弹回到指令指针寄存器。

CALL function_name
RET

14. AND,OR, XOR, NOT 指令

AND destination, source     ;   对两个操作数进行按位与操作
OR destination, source      ;   对两个操作数进行按位或操作
XOR destination, source     ;   对两个操作数进行按位异或操作
NOT reg                     ;   翻转操作数的所有位

15. TEST指令:对两个操作数进行按位与操作

TEST与AND 指令唯一不同的地方是,TEST 指令不修改目标操作数。TEST 指令允许的操作数组合与 AND 指令相同。在发现操作数中单个位是否置位时,TEST 指令非常有用。

;       测试AL寄存器的位0和位3是否为1
TEST al, 00001001b

当所以测试位都为0时,零标志位ZF才为1

16. CMP指令:比较整数

CMP destination, source

标志位
当实际的减法发生时,CMP 指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。

如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如表所示:

CMP结果ZFCF
目的操作数 < 源操作数01
目的操作数 > 源操作数00
目的操作数 = 源操作数10

如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如表所示:

CMP结果标志位
目的操作数 < 源操作数SF≠OF
目的操作数 > 源操作数SF=OF
目的操作数 = 源操作数ZF=1

一般而言,CMP指令与跳转指令相结合:

CMP指令的作用在于比较之后设置标志位,而跳转指令通过判断标志位来进行跳转,达到if语句的效果。

17. 跳转指令

跳转指令与CMP指令相结合,可以达到if语句的效果。

助记符说明标志位/寄存器助记符说明标志位/寄存器
JZ为0跳转ZF=1JNO无溢出跳转OF=0
JNA非0跳转ZF=0JS有符号跳转SF=1
JC进位跳转CF=1JNS无符号跳转SF=0
JNC无进位跳转CF=0JP偶校验跳转PF=0
JO溢出跳转OF=1JNP奇校验跳转PF=0

相等性的比较

表中符号 leftOp 和 rightOp 分别指的是 CMP 指令中的左(目的)操作数和右(源)操 作数;

助记符说明
JE相等跳转(leftOp=rightOp)
JNE不相等跳转 (leftOp M rightOp)
JCXZCX=0跳转
JECXZECX=0跳转
JRCXZRCX=0跳转(64位模式)
mov edx, 0A523h
cmp edx, 0A523h
jne L5                       ;不发生跳转
je L1                         ;跳转

无符号数比较

基于无符号数比较的跳转如下表所示。操作数的名称反映了表达式中操作数的顺序(比如 leftOp < rightOp);

助记符说明助记符说明
JA大于跳转(若 leftOp > rightOp)JB小于跳转(若 leftOp < rightOp)
JNBE不小于或等于跳转(与 JA 相同)JNAE不大于或等于跳转(与 JB 相同)
JAE大于或等于跳转(若 leftOp ≥ rightOp)JBE小于或等于跳转(若 leftOp ≤ rightOp)
JNB不小于跳转(与 JAE 相同)JNA不大于跳转(与 JBE 相同)

有符号数比较

助记符说明助记符说明
JG大于跳转(若 leftOp > rightOp)JL小于跳转(若 leftOp < rightOp)
JNLE不小于或等于跳转(与 JA 相同)JNGE不大于或等于跳转(与 JB 相同)
JGE大于或等于跳转(若 leftOp ≥ rightOp)JLE小于或等于跳转(若 leftOp ≤ rightOp)
JNL不小于跳转(与 JAE 相同)JNG不大于跳转(与 JLE 相同)

18. 移位和循环移位指令

SHR右移RCL带进位的循环左移
SAL算术左移RCR带进位的循环右移
SAR算数右移SHLD双精度左移
ROL循环左移SHRD双精度右移
SHL左移ROR循环右移

移位

  • 逻辑移位:空出来的位用 0 填充;
  • 算数移位:空出来的位用原数据的符号位填充;

循环移位

以循环方式来移位即为位元循环。

当多字节整数以四位为单位进行循环移位时,其效果相当于一次向右或向左移动一个十六进制位。例如,将 6A4Bh 反复循环左移四位,最后就会回到初始值。

mov ax, 6A4Bh
rol ax, 4              ; AX = A4B6h
rol ax, 4              ; AX = 4B6Ah
rol ax, 4              ; AX = B6A4h
rol ax, 4              ; AX = 6A4Bh

19. MUL指令:无符号乘法

乘数和被乘数的大小必须保持一致,乘积的大小则是它们的一倍。这三种类型都可以使用寄存器和内存操作数,但不能使用立即数:

MUL reg/mem8
MUL reg/meml6
MUL reg/mem32

mov al, 5h
mov bl, 10h
mul bl                    ; AX = 0050h, CF = 0

如果乘积的高半部分不为零,则 MUL 会把进位标志位和溢出标志位置 1。因为进位标志位常常用于无符号数的算术运算,在此我们也主要说明这种情况。
例如,当 AX 乘以一个 16 位操作数时,乘积存放在 DX 和 AX 寄存器对中。其中,乘积的高 16 位存放在 DX,低 16 位存放在 AX。如果 DX 不等于零,
则进位标志位置 1,这就意味着隐含的目的操作数的低半部分容纳不了整个乘积。

64 位模式下,MUL 指令可以使用 64 位操作数。一个 64 位寄存器或内存操作数与 RAX 相乘,产生的 128 位乘积存放到 RDX:RAX 寄存器中。

20. IMUL指令:有符号乘法

与 MUL 指令不同,IMUL 会保留乘 积的符号,实现的方法是,将乘积低半部分的最高位符号扩展到高半部分。

21. DIV指令:无符号除法

DIV reg/mem8
DIV reg/meml6
DIV reg/mem32

下表给出了被除数、除数、商和余数之间的关系:

被除数除数余数
AXreg/mem8ALAH
DX:AXreg/mem16AXDX
EDX:EAXreg/mem32EAXEDX

64 位模式下,DIV 指令用 RDX:RAX 作被除数,用 64 位寄存器和内存操作数作除数, 商存放到 RAX,余数存放在 RDX 中。

mov ax, 0083h      ; 被除数
mov bl, 2               ; 除数
div bl                     ; AL = 41h, AH = Olh

22. IDICV:有符号除法

有符号除法几乎与无符号除法相同,只有一个重要的区别:在执行除法之前,必须对被除数进行符号扩展。
符号扩展是指将一个数的最高位复制到包含该数的变量或寄存器的所有高位中。

符号拓展指令有:CBW,CWD,CDQ,分别对应:字节转字,字转双字,双字转四字。

23. LEA:返回间接操作数的地址

LEA 指令返回间接操作数的地址。由于间接操作数中包含一个或多个寄存器,因此会在运行时计算这些操作数的偏移量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

X86架构基本汇编指令详解 的相关文章

随机推荐

  • C语言中,通过指针得到相应数组的长度

    通过指针得到相应数组的长度 xff0c 1 通过指针得到浮点型数组的长度 2 通过指针得到字符串型数组的长度 得到浮点型数组长度 int arrayVlenth float p int len 61 0 while p p 43 43 le
  • Python监控目录文件夹,并使用SFTP上传目录及文件到linux服务器

    Python 扫描监控本地文件夹并进行超大文件上传 方案1 WebUploader大文件分块多线程并发上传 方案2 watchdog目录文件夹监控 paramiko STFP上传服务器 方案3 优化2 压缩后上传 服务器解压 1 监控本地文
  • 本地组策略编辑器关闭windows10的自动更新

    具体操作 xff1a win 43 R输入 gpedit msc 打开组策略 xff0c 在 计算机配置 管理模板 windows组件 Windows更新 里找到 指定Intranet microsoft 更新服务位置 xff0c 双击打开
  • PVE虚拟机篇-PVE虚拟机安装

    安装包下载 前往Proxmox Virtual Environment下载ISO镜像文件 xff0c 可以直接选择最新版本 但是如果没有海外线路一般下载十分缓慢 xff0c 甚至下不动 xff0c 所以可以去中科大镜像源 xff1a 中科大
  • PVE虚拟机篇-pve软件换源

    起因 由于安装pve的第二天突然发现后台显示执行错误 xff0c 更新软件源失败 xff1a 更新软件源方法 注释企业源 echo 34 deb https enterprise proxmox com debian pve bullsey
  • 解决android opengl glReadPixels 慢的问题 二

    解决android opengl glReadPixels 慢的问题 二 上篇讲到使用pbo解决glreadpix慢的问题 xff0c 但是效果不太理想 xff0c 后来参考链接 xff1a OpenGL Pixel Buffer Obje
  • Tesseract 3.02中文字库训练

    下载chi sim traindata字库 下载tesseract ocr setup 3 02 02 exe 下载地址 xff1a http code google com p tesseract ocr downloads list 下
  • Windows下使用pip安装包 出错 TLS/SSL

    Windows下使用pip安装包的时候出现如下问题 xff1a WARNING pip is configured with locations that require TLS SSL however the ssl module in
  • C++进阶(七)-模板与群体数据8

    选择排序 选择排序的基本思想 每次从待排序序列中选择一个关键字最小的元素 xff0c xff08 当需要按关键字升序排列时 xff09 xff0c 顺序排在已排序序列的最后 xff0c 直至全部排完 例9 12 简单选择排序函数模板 tem
  • Ubuntu 20.04 WARNING笔记(长期更新,欢迎交流)

    记录使用Ubuntu 20 04过程的报错 以及解决 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 循环嵌套例题

    循环嵌套例题 1 例题1 span class token comment 代码 span span class token keyword for span span class token punctuation span span c
  • java实现学生信息管理(对象数组实现)

    java实现学生信息管理 xff08 对象数组实现 xff09 1 例题 实体类 学生类 id 姓名 xff0c 年龄 xff0c 性别 xff0c 成绩 需要使用数组保存学生信息 Student allStu 需要完成的方法 1 根据学生
  • java基础语法思维导图

    java从入门到放弃 简单总结之前的
  • 学生管理系统2.0 (可对学生数组扩容)

    学生管理系统2 0 可对学生数组扩容 1 用户可初始化数组长度 xff0c 不够用时可以扩充数组容量 尝试完成以下功能 实体类 学生类 id 姓名 xff0c 年龄 xff0c 性别 xff0c 成绩 需要使用数组保存学生信息 Studen
  • LinkedList和Set

    LinkedList和Set 1 LinkedList 1 1 LinkedList概述 底层存储数据是一个双向链表结构 自行车链子 就是一个生活中链表结构 xff0c 环环相扣 xff0c 替换 xff0c 拆除非常方便 1 2 Link
  • shiro与springboot整合

    Shiro 与 SpringBoot 的整合 1 创建SpringBoot工程 xff0c 导入依赖 span class token generics function span class token punctuation lt sp
  • Vue

    Author Thor Version 9 0 1 文章目录 一 Vue简介1 1 简介1 2 MVVM 模式的实现者 双向数据绑定模式1 3 其它 MVVM 实现者1 4 为什么要使用 Vue js1 5 Vue js 的两大核心要素1
  • android AudioRecord 音频录制 噪音消除

    android AudioRecord 音频录制 噪音消除 因为公司APP做适配 xff0c 一些低端机的噪音比较严重 xff0c 所以再一些低端机上做了简单除噪音功能 xff0c 1 xff0c 由于APP使用场景的限制 xff0c 所以
  • springboot 常用注解

    springboot 常用注解 在spring boot中 xff0c 摒弃了spring以往项目中大量繁琐的配置 xff0c 通过自身默认配置 xff0c 极大的降低了项目搭建的复杂度 在spring boot中 xff0c 大量注解的使
  • X86架构基本汇编指令详解

    文章目录 汇编指令伪指令1 MODEL2 STACK3 ENDP4 END 汇编指令1 MOV xff1a 将源操作数复制到目的操作数2 MOVZX 和 MOVSX3 XCHG 交换两个操作数内容4 INC 和 DEC5 ADD 和 SUB