X86(32位)汇编指令与机器码转换原理

2023-10-27 19:01

本文主要是介绍X86(32位)汇编指令与机器码转换原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

X86(32位)汇编指令与机器码转换原理

  • 1 32位寻址形式下的ModR/M字节
  • 2 汇编指令转机器码
    • 2.1 mov ecx,[eax+ebx*2]
      • 2.1.1 查Opcode和ModR/M
      • 2.1.2 查SIB
    • 2.2 mov ecx,[eax+ebx*2+10h]
    • 2.3 mov ecx,[eax+ebx*2+00000100h]

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

在X86 32位架构下,指令格式定义中,新增了SIB字节。SIB(Scale, Index, Base)字节的意义是用于指定一种复杂的寻址方式(按比例变址寻址),在《CPU寄存器与寻址方式》中已经介绍过了。

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

ModR/M字节具体值,组成情况,如下图所示。
在这里插入图片描述
上表查询方法,已在8086 CPU章节介绍过,不再赘述。
把表格中每一类寻址方式,都举一个例子,进行描述,如下:

序号寻址方式ModR/M汇编例子备注
1disp3200101mov ecx,[00000100h]参考8086 CPU
2[EAX]00000mov ecx,[eax]参考8086 CPU
3[- -][- -]00100mov ecx,[eax+ebx*2]SIB寻址
4disp8[EAX]01000mov ecx,[eax+10h]参考8086 CPU
5disp8[- -][- -]01100mov ecx,[eax+ebx*2+10h]SIB寻址
6disp32[EAX]10000mov ecx,[eax+00000100h]参考8086 CPU
7disp32[- -][- -]10100mov ecx,[eax+ebx*2+00000100h]SIB寻址

本文主要对32位架构下,新增的寻址方式,进行讲解。
这些寻址方式中,我们主要讲解[- -][- -]、disp8[- -][- -]、disp32[- -][- -]三种,本质其实他们属于一种,都是SIB寻址。

2 汇编指令转机器码

2.1 mov ecx,[eax+ebx*2]

2.1.1 查Opcode和ModR/M

mov ecx,[eax+ebx*2],表示将eax寄存器中地址+ebx寄存器中地址*2,指向的内存单元,存储到ecx寄存器中。
查询指令手册,与MOV r32,r/m32指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。
在这里插入图片描述
因此,我们查询ModR/M表,以[- -][- -]为行,以ecx为列,交汇处0C表示ModR/M值。
我们回顾一下机器码的组成,如下图所示:
在这里插入图片描述
当前指令不存在Instruction Prefixes、Displacement和Immediate,我们已经知晓Opcode和ModR/M,因此还需要查询SIB。

2.1.2 查SIB

指令中[eax+ebx*2],其含义如下:
在这里插入图片描述
因此Scale为2,Index为ebx,Base为eax,无Displacement,我们查询SIB表,如下:
在这里插入图片描述
以Scale和Index为行(ebx*2),以Base为列(eax),交汇处58表示SIB值(Scale=01,Index=011,Base=000)。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/MSIB机器码
mov ecx,[eax+ebx*2]8B0C588B0C58

2.2 mov ecx,[eax+ebx*2+10h]

mov ecx,[eax+ebx*2+10h],表示将eax寄存器中地址+ebx寄存器中地址*2+10h,指向的内存单元,存储到ecx寄存器中。
查询指令手册,与MOV r32,r/m32指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。

我们查询ModR/M表,以disp8[- -][- -]为行,以ecx为列,交汇处4C表示ModR/M值。

在这里插入图片描述
因此Scale为2,Index为ebx,Base为eax,Displacement为10h,我们查询SIB表,以Scale和Index为行(ebx*2),以Base为列(eax),交汇处58表示SIB值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/MSIB偏移机器码
mov ecx,[eax+ebx*2+10h]8B4C58108B4C5810

2.3 mov ecx,[eax+ebx*2+00000100h]

mov ecx,[eax+ebx*2+00000100h],表示将eax寄存器中地址+ebx寄存器中地址*2+00000100h,指向的内存单元,存储到ecx寄存器中。
查询指令手册,与MOV r32,r/m32指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。

我们查询ModR/M表,以disp32[- -][- -]为行,以ecx为列,交汇处8C表示ModR/M值。

在这里插入图片描述
因此Scale为2,Index为ebx,Base为eax,Displacement为00000100h,我们查询SIB表,以Scale和Index为行(ebx*2),以Base为列(eax),交汇处58表示SIB值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/MSIB偏移机器码
mov ecx,[eax+ebx*2+00000100h]8B8C58000001008B8C5800010000

X86 32位汇编,间接寻址不用段寄存器了,直接地址就可以寻址4GB空间。,未完待续。。

这篇关于X86(32位)汇编指令与机器码转换原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/287723

相关文章

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统