X86架构基本汇编指令详解
文章目录
- 汇编指令
- 伪指令
- 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 boundALIGN 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=0MOV AX, 0MOV ECX, 5
L1:INC AXLOOP 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结果 | ZF | CF |
---|---|---|
目的操作数 < 源操作数 | 0 | 1 |
目的操作数 > 源操作数 | 0 | 0 |
目的操作数 = 源操作数 | 1 | 0 |
如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如表所示:
CMP结果 | 标志位 |
---|---|
目的操作数 < 源操作数 | SF≠OF |
目的操作数 > 源操作数 | SF=OF |
目的操作数 = 源操作数 | ZF=1 |
一般而言,CMP指令与跳转指令相结合:
CMP指令的作用在于比较之后设置标志位,而跳转指令通过判断标志位来进行跳转,达到if语句的效果。
17. 跳转指令
跳转指令与CMP指令相结合,可以达到if语句的效果。
助记符 | 说明 | 标志位/寄存器 | 助记符 | 说明 | 标志位/寄存器 |
---|---|---|---|---|---|
JZ | 为0跳转 | ZF=1 | JNO | 无溢出跳转 | OF=0 |
JNA | 非0跳转 | ZF=0 | JS | 有符号跳转 | SF=1 |
JC | 进位跳转 | CF=1 | JNS | 无符号跳转 | SF=0 |
JNC | 无进位跳转 | CF=0 | JP | 偶校验跳转 | PF=0 |
JO | 溢出跳转 | OF=1 | JNP | 奇校验跳转 | PF=0 |
相等性的比较
表中符号 leftOp 和 rightOp 分别指的是 CMP 指令中的左(目的)操作数和右(源)操 作数;
助记符 | 说明 |
---|---|
JE | 相等跳转(leftOp=rightOp) |
JNE | 不相等跳转 (leftOp M rightOp) |
JCXZ | CX=0跳转 |
JECXZ | ECX=0跳转 |
JRCXZ | RCX=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/mem32mov 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
下表给出了被除数、除数、商和余数之间的关系:
被除数 | 除数 | 商 | 余数 |
---|---|---|---|
AX | reg/mem8 | AL | AH |
DX:AX | reg/mem16 | AX | DX |
EDX:EAX | reg/mem32 | EAX | EDX |
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 指令返回间接操作数的地址。由于间接操作数中包含一个或多个寄存器,因此会在运行时计算这些操作数的偏移量。
X86架构基本汇编指令详解相关推荐
- c语言将两个16位变为一个32位,16位汇编第六讲汇编指令详解第第三讲(示例代码)...
16位汇编第六讲汇编指令详解第第三讲 1.十进制调整指令 1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之: 以前的时 ...
- 80x86汇编指令详解
80x86指令系统,指令按功能可分为以下七个部分. (1) 数据传送指令. (2) 算术运算指令. (3) 逻辑运算指令. (4) 串操作指令. (5) 控制转移指令. (6) 处理器控制指令. (7 ...
- RDTSC汇编指令详解
RDTSC - 读取时间标签计数器 操作码 指令 说明 0F 31 RDTSC 将时间标签计数器读入 EDX:EAX 说明 将处理器的时间标签计数器的当前值加载到 EDX:EAX 寄存器.时间标签计数 ...
- PIC中档单片机汇编指令详解(6)
2019独角兽企业重金招聘Python工程师标准>>> 立即数与控制操作指令 SLEEP 单片机进入低功耗休眠模式 语法形式:SLEEP 操作数:无 执行时间:一个指令周期 执行过程 ...
- PIC中档单片机汇编指令详解(4)
INCFSZ f数据寄存器内容递增1,并作判0标志 语法形式:INCFSZ f,d 操作数:f为数据寄存器的低7位地址(0x00~0x7F) d为目的寄存器的低7位地址(0x00~0x7F) 当d=f ...
- RV32I ISA 汇编指令详解
add rd, rs1, rs2 示例: add x5,x6,x7 x5=x6+x7 rd: 0b00101 rs1:0b00110 rs2:0b00111 对应32位指令格式如下: 0000000 ...
- 寄存器(1)寄存器概念,x86寄存器种类说明及汇编代码详解
寄存器(1)寄存器概念,x86寄存器种类说明及汇编代码详解 1. 什么是寄存器 1.1 概念 1. 什么是寄存器: 2. 寄存器作用: 1.2 通俗易懂理解寄存器 2. x86寄存器种类说明及汇编代码 ...
- 寄存器(3)KDB入门+MIPS汇编及汇编代码详解
KDB入门和MIPS汇编 1. KDB 介绍及进入退出命令 1.1 KDB 介绍 1.2 进入KDB及退出KDB 2. KDB 调试 2.1 断点类 2.2 内存操作类 md 2.3 堆栈跟踪类 2. ...
- arm-linux-ld中的参数,arm-linux-ld指令详解
arm-linux-ld指令详解 我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来:其次,这些.o文件存在相互调用的关系 ...
- #pragma comment和#pragma 预处理指令详解
该宏放置一个注释到对象文件或者可执行文件. 例如,#pragma comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库. 和在工程设置里写上链入 ...
最新文章
- java集合——集合接口+迭代器接口
- APP视觉稿该怎么切图和标注
- [html] 写一个密码默认星号,但可以查看密码的输入框
- NB-IoT四大关键特性及实现告诉你,为啥NB
- 2021-2025年中国电弧火花发射光谱仪行业市场供需与战略研究报告
- Skype for business server 2015和PSTN集成后,无法完成呼叫
- 数据结构上机实践第九周项目1 - 二叉树算法库
- 删除安装的python
- net根据list创建xml_#一起学spring#创建多模块项目
- js点击页面其他地方如何隐藏div元素菜单
- 360录屏时去掉跑马灯解决方法 以失败告终
- 弹出窗口背景透明 css,CSS弹出背景半透明窗口
- 【转载】ANSYS 动力分析 (9) - 瞬态动力分析 (1)
- 笔记本硬盘重装系统后只有一个盘的数据恢复方法
- LeetCode 810 Chalkboard XOR Game【思维】
- 微信硬件平台wifi设备通信第一篇
- apktool解包和打包apk
- json.stringify()详解
- 7段均衡器最佳参数_均衡器参数详解(精)
- 网关Gateway-快速上手