x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式

本文深入探讨了x86与x64汇编指令的格式与使用,包括指令复习、通用寄存器介绍、OpCode解析、寻址方式详解及x64指令格式的扩充,适合汇编语言初学者及进阶者阅读。

x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式

一丶x86指令复习.

1.1什么是x86指令.

代码如下.

1197364-20190511212140393-546097951.png
高级代码为:

int i = 0;
int *p - &i;

此时产生了3条汇编指令

mov dword ptr[i],0      OPCODE = C7 45 F4 00 00 00 00
lea eax,[i]
mov dword ptr [p],ea    OPCODE = 89 45 E8

此时观察,有两条 Mov指令. 但是机器码却不同.这个就是我们今天要讲的.

1.2 x86与x64下的通用寄存器

在x86下面,我们的通用寄存器有

eax ebx ecx edx esi edi esp ebp [e 代表 Extend(扩展)]

在x64下面,新加了几个寄存器.并且指令变大了 有16个通用寄存器

rax rbx rcx rdx rsi rdi rsp rbp
r8 r9 r10 r11 r12 r13 r14 15

在x86下,我们的寄存器都有自己的编号.

指令编号
eax000
ecx001
edx010
ebx011
esp100
ebp101
esi110
edi111

1.3 OpCode

每个指令都有一个或者多个编码.
如下常见的

指令OpCode说明
ret0xC3返回
short jump0xEB短跳转 8位
far jump0xEA长跳转,可以在4GB空间任意跳转 32位
je/jz0x74判断是否相等
jne/jnz0x75判断是否不等
nop0x90空指令

1.4 7种寻址方式

寻址方式寻址代码
立即数寻址mov eax,1
寄存器寻址mov eax,ebx
直接寻址mov eax,[2000h]
寄存器间接寻址mov eax,[ebx]
寄存器相对寻址mov eax[ebx + 0x100]
基址变址寻址mov eax,[ebx + esi]
相对基址变址寻址mov eax,[ebx + esi *n]

二丶x86指令格式详解.

在X86下,查看inter手册可以清楚的看到x86汇编的指令格式.
图标如下
1197364-20190511221410529-102866863.png

x64的图表
1197364-20190511221526030-2074064122.png

以x86为例,有6个部分. 只有Opcode时必须的.前边的可以没有

2.1 instruction 说明

instruction prefixes 指令前缀. 如 rep movs bytes ptr[esi]
rep 就是前缀.

2.2 Opcode

Opcode 这个需要查看inter手册.
如下:
1197364-20190512112733178-666114459.png

2.3 ModR/m说明

ModR/m
里面分为三部分

指令说明
Mod表示寄存器的寻址方式.
Reg/opcode表示寄存器或者OpCode的编码
R/M表示汇编中第一个寄存器的编码.

Mod 代表寻址方式 2位表示

指令说明
00寄存器间接寻址
01寄存器相对寻址偏移
10寄存器先对寻址偏移
11寄存器直接寻址

其它寻址方式放在SIB里面

Reg/Opcode 代表指令,
mov [ebp - 38h],eax. 那么就代表eax的编号
有时候表示寄存器,有时候表示Opcode

R/M 表示汇编的第一个寄存器
mov[ebp - 38h],eax 代表的是ebp

2.4 SIB说明

SIB 占一个字节.可能有可能没有,是对ModR/M寻址的补充.

一条汇编指令

mov eax,[ebx + edi * 4 + 1000h]

根据汇编指令我们可以得出:
偏移 = 1000h
倍率 = 4
基址 = ebx

那么根据上面我们的SIB解析就好办了

名称大小说明
scale2 bit表示倍率,如上面edi *4 4就是倍率,只能是1 2 4 8 ,00代表倍率为1,01=2 10 = 4 11 = 8
index3 bit表示倍率前边的寄存器 如edx * 4,那么edi的编号就放在这里
base3 bit

那么根木上面说明我们可以拆分如下.

scaleindexbase
4ediebx

2.5 Displacement 偏移说明

Displacement 其实是一个偏移
如:

mov eax,[ebx + edi * 4 + 1000h] 

1000h就是偏移,会放在这个字段当中.

可以是1个字节,可以是2个字节,或者4个字节.

2.6 immediate 立即数

immediate 是立即数
如:

mov eax,1

在32位中占 1 2 4个字节.

其中讲到这大概说明白了. 除了Opcode不能省略.其余都是可选的.
在32位指令最长可以支持17个字节.

二丶X64 汇编指令格式详解

x86图表
1197364-20190511221410529-102866863.png

x64的图表
1197364-20190511221526030-2074064122.png

在x64下,只对 x86加了一个 REX (re Extend 在扩展)

REX是一个字节.但是高4位必须为0100
REX取值范围在40-4F之间.

低四位有不同的含义,这是inter手册拿下来的
1197364-20190512113455953-1590813691.png

W (width)
如果为0 代表这个指令是32位的
如果为1 则代表指令是64位的.

R位

R主要是对32位下 MOdR/M中的 Reg/Opcode做了扩充.
以前是3位,现在是4位来表示了.
因为为了兼容32位.所以32位的表不能动.所以只能在这继续进行扩充.

X(index}
这个主要是扩充 SIB 中的index位的.

32位下 Index代表 倍率的寄存器.如 edi * 4 4是倍率. edi则是
倍率寄存器.在32位下这个是3位.只能表示一个寄存器
64下需要对它进行扩种.就是x index.

B(base)

这个主要是扩充 32位下 Modr/M 中的 R/M位. 或者 SIB中 Base基址位.

例子:
如:

mov eax,2
Opcode = b8 10 0 00 00

那么扩展为64位的就是
48 b8 10 00 00 00 00 00 00 00

48的意思就是 0100 1000
就是说 在w 位设置为1,代表的是64位汇编指令.

转载于:https://www.cnblogs.com/iBinary/p/10851743.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值