X64(64位)汇编指令与机器码转换原理

X64(64位)汇编指令与机器码转换原理

  • 1 64位寻址形式下的ModR/M字节
    • 1.1 寻址方式
    • 1.2 寄存器编号
  • 2 汇编指令转机器码
    • 2.1 mov rcx, 1122334455667788h
    • 2.2 mov rcx,[r8]与mov [r8],rcx
    • 2.3 mov rcx,[r8+r9*2]

本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。

1 64位寻址形式下的ModR/M字节

x64指令机器码组成:
在这里插入图片描述
REX prefix组成:
在这里插入图片描述
ModR/M组成:
在这里插入图片描述

1.1 寻址方式

ModR/M字节具体值,组成情况,如下图所示:在这里插入图片描述
在这里插入图片描述
ModRM.mod、ModRM.r/m和REX.B三者确定一种内存寻址方式,一共有64种内存寻址方式。

1.2 寄存器编号

ModRM.reg与REX.R位,合并扩展为4位Rrrr,表示X64架构下这16个寄存器编号,具体编号如下:

r8(/r)
r16(/r)
r32(/r)
r64(/r)
mm(/r)
AL
AX
EAX
RAX
MM0
CL
CX
ECX
RCX
MM1
DL
DX
EDX
RDX
MM2
BL
BX
EBX
RBX
MM3
AH
SP
ESP
RSP
MM4
CH
BP
EBP
RBP
MM5
DH
SI
ESI
RSI
MM6
BH
DI
EDI
RDI
MM7
r8b
r8w
r8d
r8
r9b
r9w
r9d
r9
r10b
r10w
r10d
r10
r11b
r11w
r11d
r11
r12b
r12w
r12d
r12
r13b
r13w
r13d
r13
r14b
r14w
r14d
r14
r15b
r15w
r15d
r15
Rrrr0000000100100011010001010110011110001001101010111100110111101111

2 汇编指令转机器码

我们举几个立即数操作的例子:

mov cl, 12h
mov cx, 1234h
mov ecx, 12345678h
mov rcx, 1122334455667788h

然后,把表格中每一类寻址方式,都举一个例子,进行描述,如下:

序号寻址方式ModR/MREX.B汇编例子含义
1[r8]000001mov rcx,[r8]与mov [r8],rcx(rcx)=((r8))与((r8))=(rcx)
2[SIB]00100任意mov rcx,[r8+r9*2](rcx)=((r8)+(r9)*2)
3[disp32] / [rip+disp32]00101任意mov rcx,[00001000h](rcx)=(00001000h) / (rcx)=((rip)+00001000h)
4[r8+disp8]010001mov rcx,[r8+10h](rcx)=((r8)+10h)
5[SIB+disp8]01100任意mov rcx,[r8+r9*2+10h](rcx)=((r8)+(r9)*2+10h)
6[r8+disp32]100001mov rcx,[r8+00001000h](rcx)=((r8)+00001000h)
7[SIB+disp32]10100任意mov rcx,[r8+r9*2+00001000h](rcx)=((r8)+(r9)*2+00001000h)
8r8110001mov r9,r8(r9)=(r8)
9r9110011mov r8,r9(r8)=(r9)

因此,一共有13个汇编指令转机器码的例子,接下来,依次来讲解。

2.1 mov rcx, 1122334455667788h

  • mov cl, 12h
    mov cl, 12h表示将立即数12h存储到8位寄存器cl中。
    查询指令手册,与MOV r8,imm8指令相符,其操作码为B0+ rb,rb表示目的操作数cl寄存器编号。
    在这里插入图片描述
    当前指令cl编号为1,因此操作码为B0+1=B1。
    因此指令的机器码组成,如下所示:
汇编指令操作码立即数机器码
mov cl, 12hB112B112
  • mov cx, 1234h
    mov cx, 1234h表示将立即数1234h存储到16位寄存器cx中。
    查询指令手册,与MOV r16,imm16指令相符,其操作码为B8+ rw,rw表示目的操作数cx寄存器编号。
    在这里插入图片描述
    当前指令cx编号为1,因此操作码为B8+1=B9。
    由于在X64下,默认操作数宽度是32位,需要添加指令前缀66H,“反转”选择16位宽度的操作数。
    因此指令的机器码组成,如下所示:
汇编指令指令前缀操作码立即数机器码
mov cx, 1234h66B9123466B93412
  • mov ecx, 12345678h
    mov ecx, 12345678h表示将立即数12345678h存储到32位寄存器ecx中。
    查询指令手册,与MOV r32,imm32指令相符,其操作码为B8+ rd,rd表示目的操作数ecx寄存器编号。
    在这里插入图片描述
    当前指令ecx编号为1,因此操作码为B8+1=B9。
    由于在X64下,默认操作数宽度是32位,刚好合适,因此不需添加指令前缀66H。
    因此指令的机器码组成,如下所示:
汇编指令操作码立即数机器码
mov ecx, 12345678hB912345678B978563412
  • mov rcx, 1122334455667788h
    mov rcx, 1122334455667788h表示将立即数1122334455667788h存储到64位寄存器rcx中。
    查询指令手册,与MOV r64,imm64指令相符,其操作码为REX.W + B8+ rd,rd表示目的操作数rcx寄存器编号。
    在这里插入图片描述
    当前指令rcx编号为1,因此操作码为B8+1=B9。
    REX.W说明需要REX前缀,REX.W=1表示操作位宽为64位,因此REX=48h。
    因此指令的机器码组成,如下所示:
汇编指令REX前缀操作码立即数机器码
mov rcx, 1122334455667788h48B91122334455667788h48 B9 88 77 66 55 44 33 22 11

2.2 mov rcx,[r8]与mov [r8],rcx

  • mov rcx,[r8]
    mov rcx,[r8]表示将r8寄存器中地址指向的内存单元,存储到rcx中。
    查询指令手册,与MOV r64,r/m64指令相符,其操作码为REX.W + 8B /r,/r表示这条指令具有ModR/M字段。
    在这里插入图片描述
    因此,尝试推导ModR/M值。当前指令寻址方式属于《X64指令基本格式》中“第一种,无SIB字节的内存寻址”,ModRM.mod、ModRM.r/m、REX.B三者确定一种内存寻址方式,如下图:
    在这里插入图片描述
    第一步,在源和目的操作数中,以内存寻址操作数为坐标点,反推ModRM.mod、ModRM.r/m、REX.B。
    这里内存寻址操作数为[r8],故ModRM.mod=00,ModRM.r/m=000,REX.B=1。
    第二步,在源和目的操作数中,以寄存器操作数,反推ModRM.reg与REX.R。
    这里寄存器操作数为rcx,其寄存器编号Rrrr=0001,故REX.R=0,ModRM.reg=001。

REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。ModRM=00001000=08h。
因此指令的机器码组成,如下所示:

汇编指令REX前缀操作码ModRM机器码
mov rcx,[r8]498B08498B08
  • mov [r8],rcx
    mov [r8],rcx表示将rcx寄存器内容,存储到r8寄存器中地址指向的内存单元中。
    查询指令手册,与MOV r/m64,r64指令相符,其操作码为REX.W + 89 /r,/r表示这条指令具有ModR/M字段。
    在这里插入图片描述
    因此,尝试推导ModR/M值。当前指令寻址方式属于《X64指令基本格式》中“第一种,无SIB字节的内存寻址”,ModRM.mod、ModRM.r/m、REX.B三者确定一种内存寻址方式,如下图:
    在这里插入图片描述
    第一步,在源和目的操作数中,以内存寻址操作数为坐标点,反推ModRM.mod、ModRM.r/m、REX.B。
    这里内存寻址操作数为[r8],故ModRM.mod=00,ModRM.r/m=000,REX.B=1。
    第二步,在源和目的操作数中,以寄存器操作数,反推ModRM.reg与REX.R。
    这里寄存器操作数为rcx,其寄存器编号Rrrr=0001,故REX.R=0,ModRM.reg=001。

REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。ModRM=00001000=08h。
因此指令的机器码组成,如下所示:

汇编指令REX前缀操作码ModRM机器码
mov [r8],rcx498908498908

发现没有,源操作数与目的操作数,交换传输方向后,仅操作码发生变化。也就是说,寄存器与内存之间传递数据的方向,是靠操作码来分辨的,与REX前缀、ModRM无关。

2.3 mov rcx,[r8+r9*2]

mov rcx,[r8+r9*2]表示将r8寄存器中地址+r9寄存器中地址*2,指向的内存单元,存储到rcx中。
查询指令手册,与MOV r64,r/m64指令相符,其操作码为REX.W + 8B /r,/r表示这条指令具有ModR/M字段。
在这里插入图片描述
因此,尝试推导ModR/M值。当前指令寻址方式属于《X64指令基本格式》中“第三种,带SIB字节的内存寻址”,如下图所示:
在这里插入图片描述
由于此场景下REX.B与SIB.base合并,不再与ModRM.r/m合并。
因此ModRM.mod、ModRM.r/m两者就可以确定[SIB]内存寻址方式,如下图:
在这里插入图片描述
第一步,以内存寻址操作数为坐标点,反推ModRM.mod、ModRM.r/m。
这里内存寻址操作数为[r8+r9 * 2],故ModRM.mod=00,ModRM.r/m=100。
第二步,以寄存器操作数,反推ModRM.reg与REX.R。
这里寄存器操作数为rcx,其寄存器编号Rrrr=0001,故REX.R=0,ModRM.reg=001。
第三步,。。。。。。

REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。ModRM=00001000=08h。
因此指令的机器码组成,如下所示:

汇编指令REX前缀操作码ModRM机器码
mov [r8],rcx4989084B 8B 0C 48

发现没有,源操作数与目的操作数,交换传输方向后,仅操作码发生变化。也就是说,寄存器与内存之间传递数据的方向,是靠操作码来分辨的,与REX前缀、ModRM无关

未完待续。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HPE Compute Scale-up Server 3200服务器来了!突破算力瓶颈,护航企业数字化转型

在全球数字化步入深水区的同时,伴随AIGC的迅速发展,对计算需求的迅速增长,如何高效灵活地使用算力资源成为开发者和企业发展的关注焦点。 服务器作为重要的算力基础设施之一,能快速处理大量数据,在AI时代其市场价值愈…

网络安全方向相关课题和材料

项目介绍 搜集大量网络安全行业开源项目 项目收集的思路: 一个是关注互联网企业/团队的安全开源项目,经企业内部实践,这些最佳实践值得借鉴。 一个是来自企业安全能力建设的需求,根据需求分类,如WAF、HIDS、Git监控等。 这个收集是一个长期的过程,我在GitHub创建了这…

9.MySQL索引的操作

个人主页:Lei宝啊 愿所有美好如期而遇 目录 索引操作 查询索引 创建主键索引 唯一索引的创建 普通索引的创建 全文索引的创建 删除索引 索引创建原则 索引操作 查询索引 第一种方法: show keys from 表名\G 我们了解其中几个就好。 第二种方法…

双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响

双目视觉检测的基本原理 利用相机测量宽度时,由于单个相机在成像时存在“近大远小”的现象,并且单靠摄入的图像无法知道被测物的距离,所以由被测物的跳动导致的被测物到工业相机之间距离变化,使测量精度难以提高。 因此测宽仪需…

项目综合实训,vrrp+bfd,以及策略路由的应用

目录 一. 项目需求 二. Visio设备画图 三. 设备选型 三.vlan规划 四.Ip地址规划 五.实验拓扑图 六.配置过程及结果 项目需求 1.S1作为VLAN10的主网关和根桥,S2作为v…

【C语法学习】5 - fputc()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例14.2 示例24.3 示例3 1 函数原型 fputc():将一个字符发送至指定流stream,函数原型如下: int fputc(int c, FILE *stream);2 参数 fputc()函数有两个参数c和stream: 参数c是待…

【JAVA学习笔记】 56 - 开发中如何选择集合实现类,以及Collection工具类

项目代码 https://github.com/yinhai1114/Java_Learning_Code/blob/main/IDEA_Chapter14/src/com/yinhai/Collections_.java 在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行 选择,分析如下: 0.…

npm工具使用方法介绍

npm 使用方法 文章目录 npm 使用方法安装 npm初始化项目安装依赖更新依赖卸载依赖发布包其他命令下载相关 npm 是 Node.js 的包管理工具,用于管理 Node.js 项目的依赖关系。npm 提供了丰富的命令和功能,可以帮助开发者快速构建和部署 Node.js 应用程序。…

Servlet

Servlet是运行在服务端的小型Java程序,是sun公司提供一套规范,用来处理客户端请求,响应给浏览器的动态资源。但servlet的实质就是Java代码,通过Java的API动态的向客户端输出内容(HTML) 一、使用servlet2.5实…

量化交易Copula建模应对市场低迷

一、简介 传统上,我们依靠相关矩阵来理解资产间的动态。然而,正如过去的市场崩盘所表明的那样,当风暴袭来时,许多模型都会陷入混乱。突然之间,相关性似乎趋于一致,而多样化这一经常被吹捧的风险管理口号似乎并没有提供什么庇护。 这种出乎意料的同步,即资产在经济低迷时…

虹科分享 | 太赫兹成像技术透视分层结构助力文物研究

文章来源:虹科光电Hophotonix 阅读链接:虹科分享 | 太赫兹成像技术透视分层结构助力文物研究 对于时间分辨成像方法来说,分层结构的无创检测具有挑战性,其中分辨率和对比度可能会因层间反射和色散的突出信号衰减而受到影响。在一…

【Java 进阶篇】Java Response 输出字符数据案例

在Java Web开发中,使用HTTP响应对象(Response)来向客户端发送数据是一项非常重要的任务。本篇博客将详细介绍如何使用Java中的Response对象来输出字符数据,并提供示例代码以帮助读者更好地理解和应用这一概念。不仅将讨论基础知识…

Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

redis过期策略 redis的过期策略可以通过配置文件进行配置 一、定期删除 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).…

前端食堂技术周刊第 102 期:Next.js 14、Yarn 4.0、State of HTML、SEO 从 0 到 1

美味值:🌟🌟🌟🌟🌟 口味:肥牛宽粉 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…

MS3142电机驱动器可兼容LV8548M

MS3142/MS3142S 是一个双全桥电机驱动。可兼容LV8548M(功能基本一致,管脚不兼容)。电源电压供电范围 4V 到 18V,平均电流 1.1A,电流峰值 1.54A。如果需要更高的电流能力,可以将双全桥并联使用。 四个输入脚…

11月的『备考学习计划』+高效的作息时间表 超好用~

每日作息时间表 每天有三个时间段学习效率高 上午10点左右 下午4点左右 晚上8点-10点左右 坚持住了,学习效果事半功倍 有同感的同学 可以举举手🤚,点点赞💓 每日作息时间表 6:30-7:00起床 6:30---7:00是起床的最佳时刻&am…

Spring中Bean的完整生命周期!(Bean实例化的流程,Spring后处理器,循环依赖解释及解决方法)附案例演示

Bean实例化的基本流程 加载xml配置文件&#xff0c;解析获取配置中的每个的信息&#xff0c;封装成一个个的BeanDefinition对象将BeanDefinition存储在一个名为beanDefinitionMap的Map<String,BeanDefinition>中ApplicationContext底层遍历beanDefinitionMap&#xff0c…

MySQL开发者社区交流与分享心得

MySQL是一个流行的开源关系型数据库管理系统&#xff0c;它被广泛应用于各种规模的企业和组织中。为了更好地使用MySQL&#xff0c;许多开发者会加入MySQL开发者社区&#xff0c;与其他开发者交流和分享经验。本文将介绍一些MySQL开发者社区交流与分享的心得体会。 MySQL开发者…

虚拟人运营系统介绍丨支持实时互动/直播/短视频创作,赋能元宇宙营销

2023年&#xff0c;以虚拟人为代表的元宇宙营销成为品牌营销黑马。 品牌通过虚拟人IP运营&#xff0c;形成具有一定影响力的品牌效应&#xff0c;围绕“内容持续输出——粉丝沉淀——优质运营——商业变现”的创新模式&#xff0c;打破同质化营销形式&#xff0c;利用虚拟人IP以…

Flask——接口路由技术

接口路由技术 一、Flask 简介1、环境安装&#xff1a;2、一个最小的应用3、两种运行方式 二、定义路由1、普通路由2、动态路由3、限定类型4、地址尾部的“/” 三、请求与响应-请求方法四、请求与响应-处理请求数据1、request的常用属性/方法2、get 请求参数3、json 请求4、表单…