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指令格式的更多相关文章

  1. 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...

  2. x64汇编第一讲,Vs系列配置x64环境与x86环境

    目录 x64汇编环境配置 一丶x64环境配置 1.1 VS系列编译器配置X64Asm开发环境. 二丶Vs配置X86汇编环境. x64汇编环境配置 一丶x64环境配置 现在windows系统都是64位了 ...

  3. 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用

    32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX  可以这样想,16位通 ...

  4. 对X86汇编的理解与入门

    本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理 ...

  5. 寄存器理解 及 X86汇编入门

    本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令.不同架构的CPU指令并不相同,如x86,powerpc ...

  6. X86汇编概要

    来自:https://www.cnblogs.com/jiftle/p/8453106.html 本文翻译自:http://www.cs.virginia.edu/~evans/cs216/guide ...

  7. 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...

  8. x86汇编之十(使用字符串)

    x86汇编之十(使用字符串) 转自网络,出处不详 一.传送字符串 Intel提供了完整的字符串传送指令,就像是MOV指令一样. 1.MOVS指令 1)movs指令格式 把字符串从一个位内存位置传送到另 ...

  9. x86汇编反编译到c语言之——(1)表达式求值及赋值语句

    一. 反编译一种可能的实现方式 我们的目的是将多种平台的汇编如x86,ARM,6502反编译为c语言,所以实现时先将多种汇编转化为 特定虚拟机汇编语言,然后只需要将虚拟机汇编语言反编译为c语言.其中多 ...

随机推荐

  1. xml文件操作帮助类

    xml文件的节点值获取和节点值设置 /// <summary> /// 保存单个点节点的值 /// </summary> /// <param name="Up ...

  2. Dubbo(三):框架设计

    整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层 ...

  3. The Xor-longest Path(trie树)

    题目: #10056. 「一本通 2.3 练习 5」The XOR-longest Path 解析: 做完#10051后就不是很难了 继续利用异或的性质有\(dis(u,v) = dis(1,u)\o ...

  4. 单词diamaund钻石diamaund英文

    Diamond Di"a*mond (?; 277), n. [OE. diamaund, the hardest iron, steel, diamond, Gr. . Perh. the ...

  5. JAVA Coder 的《深入分析Java Web 技术内幕》读书笔记

    本文基于<深入分析Java Web 技术内幕> <深入分析Java Web 技术内幕>,作者是 许令波,电子工业出版社.本文只是记录书本当中的精彩部分,作个人回顾和技术分享,请 ...

  6. Kubernetes学习之路(27)之k8s 1.15.2 部署

    目录 一.环境准备 二.软件安装 三.部署master节点 四.部署node节点 五.集群状态检测 一.环境准备 IP地址 节点角色 CPU Memory Hostname Docker versio ...

  7. Android:异步处理之Handler+Thread的应用

    担心原文消失,做此记录,感谢 https://www.cnblogs.com/net168/p/4075126.html 前言 很久很久以前就听说了,每一个android的应用程序都会分别运行在一个独 ...

  8. 团队——Beta版本发布

    目录 最棒团队成员信息 一.7次冲刺博客链接 二.解决的Alpha版本问题 / Beta计划任务(与Alpha版本不同点) 二.项目本次α版本的发布地址.下载安装说明 四.PM最终报告(详细报告在各冲 ...

  9. python正则表达式(5)--findall、finditer方法

    findall方法 相比其他方法,findall方法有些特殊.它的作用是查找字符串中所有能匹配的字符串,并以结果存于列表中,然后返回该列表 注意: match 和 search 是匹配一次 finda ...

  10. 第六篇 -- LINQ to XML

    一.LINQ to XML常用成员 LINQ to XML的成员, 属性列表: 属性 说明 Document 获取此 XObject 的 XDocument  EmptySequence  获取空的元 ...