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语言.其中多 ...
随机推荐
- spring Boot 学习(八、Spring Boot与与监控管理)
一.监控管理通过引入spring-boot-starter-actuator,可以使用Spring Boot为我们提供的准 生产环境下的应用监控和管理功能.我们可以通过HTTP,JMX,SSH协议来进 ...
- 关于VS2019使用Git时遇到的Bug
最近在运行vs2017时老是卡死,神烦!迫于无奈我从微软官网下载了vs2019,安装后打开项目,发现从git上拉取代码时报错如下: Please make sure you have the corr ...
- WC2018 文艺汇演《退役的你》
视频网址:https://www.bilibili.com/video/av19333297 谨以此歌献给那些曾与我们并肩前行的退役 OIer 填词 & 视频:Menci 演唱:wxh0109 ...
- Trie树的java实现
leetcode 地址: https://leetcode.com/problems/implement-trie-prefix-tree/description/ 难度:中等 描述:略 解题思路: ...
- windows 下安装 node 以及安装 git 指令使用
一.先百度搜索 node 找 Download | Node.js 二.下载 Node 根据你自己的操作系统下载 三.安装 node (注意:如果安装失败,使用管理员身份打开安装) 四.安装成功之后 ...
- JavaScript 数组(三)数组方法
常用方法及案例参考这篇:数组对象及常用方法
- SYN泛洪攻击原理及防御
拒绝服务攻击时,攻击者想非法占用被攻击者的一些资源,比如如:带宽,CPU,内存等等,使得被攻击者无法响应正常用户的请求. 讲泛洪攻击之前,我们先了解一下DoS攻击和DDoS攻击,这两个攻击大体相同,前 ...
- FFMPEG 命令行工具- ffplay
ffplay 简介 ffplay是ffmpeg工程中提供的播放器,功能相当的强大,凡是ffmpeg支持的视音频格式它基本上都支持.甚至连VLC不支持的一些流媒体都可以播放,但是它的缺点是其不是图形化界 ...
- rest framework 之解析器
一.示例 1.api/urls.py from django.urls import path, re_path from api.views import UserView, ParserView ...
- Django 之 restframework 解析器源码分析
解析器分类: 1. JSONPaser ----> 解析 JSON-serialized data (解析JSON序列化的数据) 2.FormParser ---->解析form 表单中 ...