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语言.其中多 ...
随机推荐
- 象棋中“车”的攻击范围_C#
如题: var a = new String[8,8]; int h, l; Console.WriteLine("输入车所在的行(0-7):"); h = int.Parse(C ...
- Java自学-接口与继承 抽象类
Java 抽象类 在类中声明一个方法,这个方法没有实现体,是一个"空"方法 这样的方法就叫抽象方法,使用修饰符"abstract" 当一个类有抽象方法的时候,该 ...
- python基础知识(一)
Python基础知识 计算基础知识 1.cpu 人类的大脑 运算和处理问题 2.内存 临时存储数据 断电就消失了 3.硬盘 永久存储数据 4.操作系统 调度硬件设备之间数据交互 python的应用和历 ...
- 原生js实现模块来回拖拽效果
代码比较冗余,还没来得及做整理,往见谅. 主要用到的 JS 事件有: onmousedown:鼠标点下事件 onmousemove:鼠标移动事件 onmouseup:鼠标放开事件 具体代码如下: &l ...
- ios、安卓前端兼容性
1.日期兼容性 解决方法(请看我上一篇文章)安卓.ios时间转换成时间戳的形式 2.input框聚焦,ios出现outline或者阴影,安卓显示正常 解决方法 input:focus{outline: ...
- jQuery的内部运行机制和原理
jQuery的优点: jQuery是一个非常优秀的JavaScript库,与Prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从Web开发实用的角度出发,抛除了其它Lib中 ...
- git的基本使用和多人协作合并管理
1.代码版本控制工具 git 分布式 svn 集中式 2.配置git 配置用户名以及邮箱账号,用于记录用户信息 git config --global user.name 'wudaxun' git ...
- java集合学习(2):Map和HashMap
Map接口 java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map. Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含 ...
- docker指定固定IP创建容器
问题描述: docker默认使用的docker0,子网172.17.0.0/16,不支持指定IP启动容器 问题解决: 新增网段bridge指定别的网段即可 01.docker新增network 新建n ...
- saltstack--状态判断unless与onlyif
saltstack状态判断unless与onlyif 很多时候我们在编写 state 文件时候需要进行判断,判断该目录或文件是否存在,判断该配置是否已经已添加,然后根据判断结果再决定命令或动作是否执行 ...