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.rhkb.cn/news/177009.html

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

相关文章

Uniapp开发的开源盲盒系统源码

最近比较火的盲盒系统,该项目是基于uniapp开发的盲盒项目,有需要的朋友可以联系我,运营级的项目,本次开源的是uniapp前端模板,选用技术为JAVA,采用框架:spring bootmybatisvue开发。 通过node安…

Javassist讲解1(介绍,读写字节码)

Javassist讲解1(介绍,读写字节码) 介绍一、读写字节码1.如何创建新的类2.类冻结 介绍 javassist 使Java字节码操作变得简单,它是一个用于在Java中编辑字节码的类库; 它使Java程序能够在运行时定义一个新类,…

6-3 求二叉树的高度 分数 10

int Depth(BiTree Tree) {if (!Tree)return 0;return Depth(Tree->lchild) > Depth(Tree->rchild) ? Depth(Tree->lchild) 1 : Depth(Tree->rchild) 1; }

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件:上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振, 49_999_999 是 1秒…

apk反编译修改教程系列---简单去除apk联网权限 其他权限 无法自动更新等【四】

往期教程: apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 目前基本所有的apk都有联网设…

Zynq UltraScale+ XCZU5EV 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

分布式消息队列:Rabbitmq(2)

目录 一:交换机 1:Direct交换机 1.1生产者端代码: 1.2:消费者端代码: 2:Topic主题交换机 2.1:生产者代码: 2.2:消费者代码: 二:核心特性 2.1:消息过期机制 2.1.1:给队列中的全部消息指定过期时间 2.1.2:给某条消息指定过期时间 2.2:死信队列 一:交换机 1:Direct交…

macOS 创建Flutter项目

参考在 macOS 上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 这个文档,配置好flutter的环境 编辑器可以选择vscode或者IDEA。 我这里以IDEA为例 打开 IDE 并选中 New Flutter Project。 选择 Flutter,验证 F…

云游长江大桥,3DCAT实时云渲染助力打造沉浸化数字文旅平台

南京长江大桥是中国第一座自主设计建造的双层公路铁路桥,也是世界上最早的双层公路铁路桥之一。它不仅是一座桥梁,更是一座历史文化的见证者和传承者。它见证了中国人民的智慧和奋斗,承载了中国社会的变迁和发展。 如何让这座不可移动的文物…

FreeRTOS_信号量之互斥信号量

目录 1. 互斥信号量 1.1 互斥信号量简介 1.2 创建互斥信号量 1.2.1 函数 xSemaphoreCreateMutex() 1.2.2 函数 xSemaphoreCreateMutexStatic() 1.2.3 互斥信号量创建过程分析 1.2.4 释放互斥信号量 1.2.5 获取互斥信号量 2. 互斥信号量操作实验 2.1 实验程序 2.1.1 …

Linux:文件操作

目录 一、关于文件 1、文件类的系统接口 2、文件的含义 二、文件操作 1、C语言文件相关接口 2、系统接口 open close write read 三、文件描述符 关于fd fd的分配规则 输出重定向示例 输入重定向示例 追加重定向示例 dup2函数 缓冲区 stdout与stderr perror…

Webpack常见的插件和模式

文章目录 一、认识插件Plugin1.认识Plugin 二、CleanWebpackPlugin三、HtmlWebpackPlugin1.生成index.html分析2.自定义HTML模板3.自定义模板数据填充 四、DefinePlugin1.DefinePlugin的介绍2.DefinePlugin的使用 五、Mode配置 一、认识插件Plugin 1.认识Plugin Webpack的另一…

数据结构:算法(特性,时间复杂度,空间复杂度)

目录 1.算法的概念2.算法的特性1.有穷性2.确定性3.可行性4.输入5.输出 3.好算法的特质1.正确性2.可读性3.健壮性4.高效率与低存储需求 4.算法的时间复杂度1.事后统计的问题2.复杂度表示的计算1.加法规则2.乘法规则3.常见函数数量级比较 5.算法的空间复杂度1.程序的内存需求2.例…

5.3 用户定义的完整性

思维导图: 5.3 用户定义的完整性 用户定义的完整性是确保数据库中的数据满足特定应用的语义要求。这是通过关系数据库管理系统(RDBMS)中的内置机制来完成的,不需要依赖应用程序来执行。 5.3.1 属性上的约束条件 1. 定义属性上的约束条件 当在CREATE T…

centos7安装oxidized备份软件

首先需要提前下载ruby,因为默认yum安装的版本太低 https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz 1、yum remove ruby ruby-devel(有就卸载,没有则忽略) 2、将下载好的ruby包解压到/opt下 [rootoxidized ruby-…

Python---字符串输入和输出---input()、格式化输出:%,f形式,format形式

字符串输入: 在Python代码中,我们可以使用input()方法来接收用户的输入信息。记住:在Python中,input()方法返回的结果是一个字符串类型的数据。 如果之后使用输入的数据,一定要记得利用数据类型转换。 相关链接:Pyt…

nodejs升级或降级

node有一个模块叫n,是专门用来管理node.js的版本。 升级或降级步骤 1 、安装n模块 npm install -g n 2、 升级node.js到最新稳定版 n stable Ps: n后面也可以跟随版本号(用于升级或降级)比如: n v16.12.0

蚂蚁SOFA Stack融合大模型发布升级版 将为机构产研效能提升30%

11月1日,在云栖大会上,蚂蚁集团正式发布CodeFuse全面加持的SOFAStack5.0升级版本,向企业提供全方位研发运维智能助手相关能力。这是继蚂蚁集团在外滩大会发布代码大模型CodeFuse之后,首次公布面向行业的商业化产品进展。 “大模型…

Controllable Guide-Space for Generalizable Face Forgery Detection

一、研究背景 以往工作专注于提取伪造特征的共同特性和真假域鉴别性信息,以提升特征泛化性。 但在训练过程中,这些方法只区分真假域,并将不同的伪造域看作一类而不加以区分。 这会导致伪造样本进一步以伪造不相关特征(如&#xff…

ACID模型

ACID 是数据库管理系统(DBMS)中用来确保事务处理正确性和可靠性的四个特性的首字母缩写。ACID 是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性&#xff08…