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

news2024/11/29 10:49:12

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.coloradmin.cn/o/1159877.html

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

相关文章

重温云栖,分享十年成长:我和云栖的故事

文章目录 前言活动背景我和云栖的交际历届峰会主题2009201020112012201320142015201620172018202120222023 技术带来的变化工作生活关注的领域 后记 前言 云栖大会,前身可追溯到2009年的地方网站峰会,2011年演变为阿里云开发者大会,2015年正式…

python线程(进程子单位)

进程是由CPU给分配的执行单元,比较消耗空间和内存 创建、使用线程 import threading# 进程 # 线程 from time import sleepdef download():list1 ["girl.png", "boy.png", "child.png"]for l in list1:print(l)sleep(1.5)print(&qu…

ThinkPad T14 2023评测|thinkpad t14 gen4

一、购买地址 我在淘宝、京东、联想商城、苏宁易购都看了看,最终确定了在抖音官方商城买电脑,主要是价格低,足足少了四百,还送了一个电脑包和一个鼠标。 二、硬件信息 2.1 内存 这个运行内存比较有意思,我还是第一次买…

前端JavaScript

文章目录 一、JavaScript概述JS简介1.ECMAScript和JavaScript的关系2.ECMAScript的历史3.什么是javas?4.JavaScript的作用? 三者之间的作用JS基础1.注释语法2.引入js的多种方式3.结束符号 变量与常量变量1.JavaScript声明2.var与let的区别常量 基本数据类…

【Linux进程】再谈软件—操作系统(Operator System)

目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。 笼统的理解,操作系统…

206. 反转链表、Leetcode的Python实现

博客主页:🏆看看是李XX还是李歘歘 🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今…

Springboot+shiro,完整教程,带你学会shiro

您的第一个 Apache Shiro 应用程序 引入依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

一文深入了解 CPU 的型号、代际架构与微架构

在 10 月 16 号的时候&#xff0c;Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机&#xff0c;给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在整个计算机硬件中、技术体系中都算是最最重…

关于pytorch张量维度转换及张量运算

关于pytorch张量维度转换大全 1 tensor.view()2 tensor.reshape()3 tensor.squeeze()和tensor.unsqueeze()3.1 tensor.squeeze() 降维3.2 tensor.unsqueeze(idx)升维 4 tensor.permute()5 torch.cat([a,b],dim)6 torch.stack()7 torch.chunk()和torch.split()8 与tensor相乘运算…

嵌入式Linux系统的闪存设备和文件系统学习纪要

嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下&#xff1a; NAND Flash 是一种非易失性存储器&#xff08;Non-Volatile Memory&#xff09;&#xff0c;常用于闪存设备和固态硬盘&#xff08;SSD&#xff09;中。以下是几种常见的 NAND Flash 种类&…

234. 回文链表、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…

iptables 与 firewalld

iptables 一、主机型&#xff08;包过滤防火墙&#xff09; 1、简介&#xff1a; 包过滤型防火墙是一种网络安全设备或软件&#xff0c;它工作在 2、3、4 层&#xff0c;通过检查网络数据包的源地址、目标地址、协议、端口等信息&#xff0c;根据预定义的规则来决定是否允许…

垃圾回收GC

为什么要有垃圾回收? JVM之所以要有垃圾回收,是因为它能够自动管理内存,避免内存泄漏和内存溢出的问题,垃圾回收机制会自动检测和清理不再使用的对象,释放内存空间,使得开发者不需要手动管理内存,降低了开发难度和错误风险,同时,垃圾回收还可以优化内存分配,提高程序性能和响…

1985-2020年我国30m土地利用覆盖数据介绍

土地覆盖(LC)决定了地球各圈层之间的能量交换、水和碳循环。准确的 LC 信息是环境和气候研究的基本参数。考虑到在过去几十年中&#xff0c;随着经济建设的发展&#xff0c;中国发生了巨大的变化&#xff0c;连续和精细的 LC 监测是迫切需要的。然而&#xff0c;目前&#xff0…

File类、方法递归

File:代表文本 IO流&#xff1a;读写数据 1、 File 类构建对象的方式是什么样的&#xff1f; File 的对象可以代表哪些东西&#xff1f; 注意 File 对象既可以代表文件、也可以代表文件夹。 ● File 封装的对象仅仅是一个路径名&#xff0c;这个路径可以是存在的&#xff0c…

JavaScript从入门到精通系列第二十七篇:详解JavaScript中的包装类

大神引荐&#xff1a;作者有幸结识技术大神孙哥为好友获益匪浅&#xff0c;现在把孙哥视频分享给大家 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻JavaS…

uniapp 查看安卓第三方插件抛出的异常

0.安装好andriod studio 和hbuilder 1.配置环境变量 鼠标右键此电脑-》设置》关于》高级系统设置》环境变量》系统变量》path中加入 具体的hbuildr adb目录看个人 2.在cmd中输入命令adb version 查看是否配置成功 出现版本号就是配置成功了 3.去hbuilder中&#xff0c;导航栏运…

04.Oracle的体系架构

Oracle的体系架构 一、主要组件 一、主要组件 下面是一张网图&#xff0c;大家可以了解一下oracle的体系架构 Oracle数据库的体系架构可以分为以下几个主要组件&#xff1a;实例&#xff08;Instance&#xff09;、数据库&#xff08;Database&#xff09;、表空间&#xff…

Kafka保证百万级数据写入和重发问题

Kafka作为当下流行的高并发消息中间件&#xff0c;大量用于数据采集&#xff0c;实时处理等场景&#xff0c; 那么它如何做到百万级写入速度呢?我们在享受它带来的高并发&#xff0c;高可靠等便利时&#xff0c;同时不得不面对可能存在的问题&#xff0c;项目中最常见的就是丢…

【KMP算法,数组】

文章目录 KMP算法数组数组的抽象类型定义数组的顺序存储三维数组 KMP算法 KMP算法设计思想&#xff1a; 利用已经部分匹配的结果而加快模式串的滑行速度&#xff0c;且主串S的指针i不必回溯&#xff0c;可提速到O(nm)&#xff1b; 定义next[j]函数&#xff0c;表明当模式中第j…