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+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Java实现XML与JSON的互相转换详解

《Java实现XML与JSON的互相转换详解》这篇文章主要为大家详细介绍了如何使用Java实现XML与JSON的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. XML转jsON1.1 代码目的1.2 代码实现2. JSON转XML3. JSON转XML并输出成指定的

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组