x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式
x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式
一丶x86指令复习.
1.1什么是x86指令.
代码如下.
高级代码为:
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下,我们的寄存器都有自己的编号.
指令 | 编号 |
---|---|
eax | 000 |
ecx | 001 |
edx | 010 |
ebx | 011 |
esp | 100 |
ebp | 101 |
esi | 110 |
edi | 111 |
1.3 OpCode
每个指令都有一个或者多个编码.
如下常见的
指令 | OpCode | 说明 |
---|---|---|
ret | 0xC3 | 返回 |
short jump | 0xEB | 短跳转 8位 |
far jump | 0xEA | 长跳转,可以在4GB空间任意跳转 32位 |
je/jz | 0x74 | 判断是否相等 |
jne/jnz | 0x75 | 判断是否不等 |
nop | 0x90 | 空指令 |
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汇编的指令格式.
图标如下
x64的图表
以x86为例,有6个部分. 只有Opcode时必须的.前边的可以没有
2.1 instruction 说明
instruction prefixes 指令前缀. 如 rep movs bytes ptr[esi]
rep 就是前缀.
2.2 Opcode
Opcode 这个需要查看inter手册.
如下:
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解析就好办了
名称 | 大小 | 说明 |
---|---|---|
scale | 2 bit | 表示倍率,如上面edi *4 4就是倍率,只能是1 2 4 8 ,00代表倍率为1,01=2 10 = 4 11 = 8 |
index | 3 bit | 表示倍率前边的寄存器 如edx * 4,那么edi的编号就放在这里 |
base | 3 bit |
那么根木上面说明我们可以拆分如下.
scale | index | base |
---|---|---|
4 | edi | ebx |
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图表
x64的图表
在x64下,只对 x86加了一个 REX (re Extend 在扩展)
REX是一个字节.但是高4位必须为0100
REX取值范围在40-4F之间.
低四位有不同的含义,这是inter手册拿下来的
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位汇编指令.
x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式的更多相关文章
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- x64汇编第一讲,Vs系列配置x64环境与x86环境
目录 x64汇编环境配置 一丶x64环境配置 1.1 VS系列编译器配置X64Asm开发环境. 二丶Vs配置X86汇编环境. x64汇编环境配置 一丶x64环境配置 现在windows系统都是64位了 ...
- 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用
32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX 可以这样想,16位通 ...
- 对X86汇编的理解与入门
本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理 ...
- 寄存器理解 及 X86汇编入门
本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令.不同架构的CPU指令并不相同,如x86,powerpc ...
- X86汇编概要
来自:https://www.cnblogs.com/jiftle/p/8453106.html 本文翻译自:http://www.cs.virginia.edu/~evans/cs216/guide ...
- 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...
- x86汇编之十(使用字符串)
x86汇编之十(使用字符串) 转自网络,出处不详 一.传送字符串 Intel提供了完整的字符串传送指令,就像是MOV指令一样. 1.MOVS指令 1)movs指令格式 把字符串从一个位内存位置传送到另 ...
- x86汇编反编译到c语言之——(1)表达式求值及赋值语句
一. 反编译一种可能的实现方式 我们的目的是将多种平台的汇编如x86,ARM,6502反编译为c语言,所以实现时先将多种汇编转化为 特定虚拟机汇编语言,然后只需要将虚拟机汇编语言反编译为c语言.其中多 ...
随机推荐
- LinkedList、ArrayList、Vector三者的关系与区别?
LinkedList.ArrayList.Vector三者的关系与区别? 区分ArrayList,Vector,LinkedList的区别 ArrayList,Vector的区别: 1.出现版本:Ar ...
- 【3.1】学习C++之再逢const
随着学习的深入,就会发现曾经学的const还有更深入的用法,现在就对const的未总结的用法进行总结. 本文就是针对const在类中的情况进行的总结. 有时我们会遇到下面这种将类的成员变量用const ...
- Django ForeignKey不需要参照完整性?
我想在django模型中设置一个ForeignKey字段,它在某些时候指向另一个表.但我希望可以在这个字段中插入一个id,它引用另一个表中可能不存在的条目.因此,如果该行存在于另一个表中,我希望获得F ...
- pandas-17 关于nan的处理
pandas-17 关于nan的处理 在pandas中有个另类的存在就是nan,解释是:not a number,不是一个数字,但是它的类型确是一个float类型.numpy中也存在关于nan的方法, ...
- QTGraphics-View拖拽以及鼠标指针操作
因为QGraphicsView继承自QWidget,它也提供了像QWidget那样的拖拽功能. 另外,为了方便,Graphics View框架也为场景以及每个item提供拖拽支持.当视图接收到拖拽事件 ...
- 5 dex文件
Dex文件中数据结构 类型 含义 u1 等同于uint8_t,表示1字节无符号数 u2 等同于uint16_t,表示2字节的无符号数 u4 等同于uint32_t,表示4字节的无符号数 u8 等同于u ...
- Mac 提示错误”xcrun: error“
错误现象: Mac 安装python模块时出现异常错误 xcrun: error: invalid active developer path (/Library/Developer/CommandL ...
- prometheus学习系列六: Prometheus relabel配置
relabel_config 重新标记是一个功能强大的工具,可以在目标的标签集被抓取之前重写它,每个采集配置可以配置多个重写标签设置,并按照配置的顺序来应用于每个目标的标签集. 目标重新标签之后,以_ ...
- Buuctf-------WEB之easy_tornado
1.给了三个提示 flag在/fllllllllllllag这里 Render+tornado这两个东西,显然是python web 根据提示flag所在文件夹,加上路径去访问,发现无法访问,被跳转到 ...
- GitLab企业级代码管理仓库
原文:https://www.cnblogs.com/wsnbba/p/10171052.html 使用GitHub或者码云等公共代码仓库 使用GitLab私有仓库 GitLab是什么? 是一个用 ...