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


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

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

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

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

序号寻址方式ModR/M汇编例子含义机器码转换
1disp3200101mov ecx,[00000100h](ecx)=(00000100h):表示将地址00000100h,指向的内存单元,存储到ecx寄存器中。参考8086 CPU
2[EAX]00000mov ecx,[eax](ecx)=((eax)):表示将eax寄存器中地址,指向的内存单元,存储到ecx寄存器中。参考8086 CPU
3[- -][- -]00100mov ecx,[eax+ebx*2](ecx)=((eax)+(ebx) * 2):表示将eax寄存器中地址+ebx寄存器中地址*2,指向的内存单元,存储到ecx寄存器中。SIB寻址
4disp8[EAX]01000mov ecx,[eax+10h](ecx)=((eax)+10h):表示将eax寄存器中地址+10h,指向的内存单元,存储到ecx寄存器中。参考8086 CPU
5disp8[- -][- -]01100mov ecx,[eax+ebx*2+10h](ecx)=((eax)+(ebx) * 2+10h):表示将eax寄存器中地址+ebx寄存器中地址*2+10h,指向的内存单元,存储到ecx寄存器中。SIB寻址
6disp32[EAX]10000mov ecx,[eax+00000100h](ecx)=((eax)+00000100h):表示将eax寄存器中地址+00000100h,指向的内存单元,存储到ecx寄存器中。参考8086 CPU
7disp32[- -][- -]10100mov ecx,[eax+ebx*2+00000100h](ecx)=((eax)+(ebx) * 2+00000100h):表示将eax寄存器中地址+ebx寄存器中地址*2+00000100h,指向的内存单元,存储到ecx寄存器中。SIB寻址

在32位X86架构下,内存寻址,不需要段地址作为基址,这与16位8086有区别,需要注意。
本文主要对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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值