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语言.其中多 ...
随机推荐
- 好用的数据库字典查看工具SQLToolbelt
工作中经常为诸多的陌生或没有任何表或者字段说明或者文档庞大数据库和数据库表所烦恼,有以下场景: 1.新进入一家公司,开始接触新的项目,领导给你一大堆文档,在不了解具体逻辑的情况下,除了项目的结构,能让 ...
- POI SXSSF API 导出1000万数据示例
SXSSF是XSSF API的兼容流式扩展,在必须生成非常大的电子表格.并且堆空间有限时使用. SXSSF通过限制对滑动窗口内数据的访问实现低内存占用,而XSSF允许访问文档中的所有行. 不在窗口中的 ...
- bytearray与矩阵转换对应关系
import numpy as npimport osa=bytearray(os.urandom(27))# for i in range(21):# print(a[i])a=np.array(a ...
- 安装和使用pyltp
什么是pyltp: pyltp 是LTP的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能. 安装 pyltp 测试环境:系统win10 64位, pytho ...
- Laravel使用Redis共享Session
一.当系统的访问量上升的时候,使用Redis保存Session可以提高系统的性能,同时也方便多机负载的时候共享Session 打开config/database.php.在redis中增加sessio ...
- npm升级到最新版本、指定版本
npm 升级到最新版本 //linux下 npm install -g npm npm升级到指定版本 //比如升级到5.6.0 npm install -g npm@5.6.0
- 微信小程序调用云函数出错 Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail cloud function service error code -501005, error message Environment not found;
错误异常: Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail cloud ...
- centos7.5内核编译安装
1.安装依赖 yum -y install gcc bc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel ...
- xenserver 备份和还原
1. 备份和还原xenserver host系统 //备份 # xe host-backup file-name=[name.xbk] -s [ip] -u [username] -pw [passw ...
- Android Studio--Logcat
他只是坐在那里,嘴里说:“做这个!做那个!当然,什么都不会发生,光说不做是没有用的” --哈里·杜鲁门“论<总统的权利>” 移动端的技术演进愈演愈烈,原生突破口已被打破. flutter. ...