8086(16位)汇编指令与机器码转换原理


本文属于《 X86架构指令基础系列教程》之一,欢迎查看其它文章。
在上一节,我们讲了X86指令基本格式。在8086架构下,是不存在SIB字节的,因此,我们重点关注ModR/M。

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

ModR/M由Mod + RM + Reg/Opcode三部分组成,如下所示:
在这里插入图片描述
许多指令的机器码组成中都需要使用ModR/M字段,8086 CPU为16位寻址,因此需要了解16位寻址形式下的ModR/M字节具体值,组成情况,如下图所示。
在这里插入图片描述
ModR/M表查询方法:

  • Mod值,在上表蓝框中Mod列下,可以是00、01、10、11共4种。
  • R/M值,在上表蓝框中R/M列下,可以是000、001、010、011、100、101、110、111共8种;Mod字段与R/M字段组合,形成32个可能的值:8个寄存器和24种寻址模式。
  • Reg/Opcode值,在上表红框中(AX、CX、DX、…),可以是000、001、010、011、100、101、110、111共8种。

类似于坐标的方式,通过Mod和R/M值来确定哪一行,Reg/Opcode值来确定哪一列,所交汇的单元格,就是ModR/M字节的值。

比如:

Mod为00,R/M为011,对应的寻址方式为[bp+di];
Reg/Opcode为001,表示CL/CX/ECX/MM1寄存器或操作,所组成的ModR/M值为0Bh。

2 汇编指令转机器码

如果想了解指令的机器码,就需要了解 x86 处理器的指令集。
要想了解 x86 处理器的指令集,Intel 的官方资料是必不可少的,下面是 x86 架构软件开发手册,可以从这里下载。
在这里插入图片描述
我们举几个立即数操作的例子:

mov al, 3
mov cx, 3
mov edx, 3

然后,把表格中每一类寻址方式,都举一个例子,进行描述,如下:

序号寻址方式ModR/M汇编例子含义
1disp1600110mov cx,[0100h]与mov [0100h],cx(cx)=((ds)*16+0100h)与((ds)*16+0100h)=(cx)
2[BX]00111mov cx,[bx](cx)=((ds)*16+(bx))
3[BX+SI]00000mov cx,[bx+si](cx)=((ds)*16+(bx)+(si))
4[BX]+disp801111mov cx,[bx+10h](cx)=((ds)*16+(bx)+10h)
5[BX+SI]+disp801000mov cx,[bx+si+10h](cx)=((ds)*16+(bx)+(si)+10h)
6[BX]+disp1610111mov cx,[bx+0100h](cx)=((ds)*16+(bx)+0100h)
7[BX+SI]+disp1610000mov cx,[bx+si+0100h](cx)=((ds)*16+(bx)+(si)+0100h)
8ECX/CX/CL/MM111001mov ax,cx(ax)=(cx)
9EAX/AX/AL/MM011000mov cx,ax(cx)=(ax)

因此,一共有12个汇编指令转机器码的例子,接下来,依次来讲解。

通常将一条汇编指令,转换为机器码,需要经过如下几个步骤:

  • 找到汇编指令对应的操作码;
  • 查询ModR/M表,确定ModR/M值;
  • 查询SIB表,确定SIB值。
  • 确定其他偏移、立即数等,最终组合成为一串二进制码。

2.1 mov al, 3

在这里插入图片描述
mov al, 3表示将立即数3存储到8位寄存器al中。
查询指令手册,与MOV r8,imm8指令相符,其操作码为B0+rb,rb表示目的操作数r8寄存器的编号。
当前指令的r8,就是al,al编号为0,因此操作码为B0+0=B0。
在这里插入图片描述
上面的编号,每个数字都代表了一组寄存器。比如:数字 0 代表了 AL、AX、EAX、MM0这一组寄存器;数字 1 代表了 CL、CX、ECX、MM1这一组寄存器;依此类推。

根据X86指令基本格式定义,当前指令不存在Instruction Prefixes、ModR/M、SIB和Displacement,如下:
在这里插入图片描述
目前mov指令和al寄存器,都在操作码中体现了,但是立即数还没有体现,因此指令的机器码组成,如下所示:

汇编指令操作码立即数机器码
mov al,3B03B003

2.2 mov cx, 3

mov cx, 3表示将立即数3存储到16位寄存器cx中。
查询指令手册,与MOV r16,imm16指令相符,其操作码为B8+ rw,rw表示目的操作数r16寄存器的编号。
在这里插入图片描述
当前指令的r16,就是cx,cx编号为1,因此操作码为B8+1=B9。
根据X86指令基本格式定义,当前指令不存在Instruction Prefixes、ModR/M、SIB和Displacement。
目前mov指令和cx寄存器,都在操作码中体现了,但是立即数还没有体现,因此指令的机器码组成,如下所示:

汇编指令操作码立即数机器码
mov cx, 3B93B90300

机器码左边为低地址,右边为高地址,为了存储16位形式的0003h,需要将高8位00h放入高地址,低8位03h放入低地址,因此立即数表示为0300h。

2.3 mov edx, 3

mov edx, 3表示将立即数3存储到32位寄存器edx中。
查询指令手册,与MOV r32,imm32指令相符,其操作码为B8+ rd,rd表示目的操作数r32寄存器的编号。
在这里插入图片描述

当前指令的r32,就是edx,edx编号为2,因此操作码为B8+2=BA。
根据X86指令基本格式定义,当前指令不存在Instruction Prefixes、ModR/M、SIB和Displacement。
目前mov指令和edx寄存器,都在操作码中体现了,但是立即数还没有体现,因此指令的机器码组成,如下所示:

汇编指令操作码立即数机器码
mov edx, 3BA3BA03000000

2.4 mov cx,[0100h]与mov [0100h],cx

mov cx,[0100h],段地址默认在ds中,表示将ds * 16 + 0100h位置处内存单元数据(2字节),存储到16位寄存器cx中。
查询指令手册,与MOV r16,r/m16指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。
在这里插入图片描述
因此,我们查询ModR/M表,如下图所示:
在这里插入图片描述
我们首先分析指令mov cx,[0100h]的组成,目的操作数为cx,源操作数为[0100h];表格中disp16的意思是Displacement16,即16位的偏移,汇编中[0100h]正是disp16,比如[10h]就是disp8,[00010000h]就是disp32。
因此,以disp16为行,以CX为列,交汇处0E表示ModR/M值(Mod=00,Reg/Opcode=001,R/M=110)。
目前mov指令和cx寄存器,都在操作码中体现了,但是偏移0100h还没有体现,因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M偏移机器码
mov cx,[0100h]8B0E01008B0E0001

机器码中,0100h,仍然保持低字节放在低地址,高字节放在高地址。

mov cx,ds:[0100h]mov cx,cs:[0100h],其机器码也是8B0E0001,唯一的区别是所使用的段寄存器不一样,前者是cx = ds * 16 + 0100h,后者是cx = cs * 16 + 0100h。

另外,试想一下mov [0100h],cx,又该如何查询ModR/M表?
在这里插入图片描述
此时,其操作码为89 /r。查ModR/M表时,实际上还是以disp16为行,以CX为列,来定位ModR/M值,依旧为0E。

汇编指令操作码ModR/M偏移机器码
mov [0100h],cx890E0100890E0001

我们可以看出,当内存与寄存器之间进行数据操作时,ModR/M值与写入的方向无关,此时写入方向是由操作码来进行区别的。

所以,我们查ModR/M表时,需要重点注意:

  • 情况1,内存与寄存器之间进行数据操作的指令,必须以内存寻址方式为行,以寄存器操作数为列,去定位ModR/M值;
  • 情况2,寄存器与寄存器之间进行数据操作的指令,必须以源操作数为行,以目的操作数为列,去定位ModR/M值。

情况1,内存与寄存器进行数据操作,如下图所示:
在这里插入图片描述
情况2,寄存器与寄存器进行数据操作,如下图所示:
在这里插入图片描述
情况2,具体分析见mov ax,cx与mov cx,ax指令。

2.5 mov ax,cx与mov cx,ax

mov ax,cx,表示将cx寄存器内容存储到ax寄存器中。
查询指令手册,与MOV r16,r/m16指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。
在这里插入图片描述
因此,我们查询ModR/M表,如下图所示:
在这里插入图片描述
以源操作数cx为行,以目的操作数ax为列,交汇处C1表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M机器码
mov ax,cx8BC18BC1

另外,mov cx,ax指令,其操作码也为8B /r,查询ModR/M表,如下图所示:
在这里插入图片描述
以源操作数ax为行,以目的操作数cx为列,交汇处C8表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M机器码
mov cx,ax8BC88BC8

我们可以看出,当寄存器与寄存器之间进行数据操作时,ModR/M值决定了,目的和源操作数所使用的是哪个寄存器,以及寄存器写入的方向。

2.6 mov cx,[bx]

mov cx,[bx],段地址默认在ds中,表示将ds * 16 + bx寄存器中地址,指向内存单元数据(2字节),存储到16位寄存器cx中。
查询指令手册,与MOV r16,r/m16指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。
在这里插入图片描述
因此,我们查询ModR/M表,以[bx]为行,以cx为列,交汇处0F表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M机器码
mov cx,[bx]8B0F8B0F

2.7 mov cx,[bx+si]

mov cx,[bx+si],段地址默认在ds中,表示将ds * 16 + bx寄存器中地址 + si寄存器中地址,指向内存单元数据(2字节),存储到16位寄存器cx中。
MOV r16,r/m16指令相符,其操作码为8B /r。

查ModR/M表,以[bx+si]为行,以cx为列,交汇处08表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M机器码
mov cx,[bx+si]8B088B08

2.8 mov cx,[bx+10h]

mov cx,[bx+10h],段地址默认在ds中,表示将ds * 16 + bx寄存器中地址 + 10h,指向内存单元数据(2字节),存储到16位寄存器cx中。
MOV r16,r/m16指令相符,其操作码为8B /r。

查ModR/M表,以[bx]+disp8为行,以cx为列,交汇处4F表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M偏移机器码
mov cx,[bx+10h]8B4F108B4F10

2.9 mov cx,[bx+si+10h]

mov cx,[bx+si+10h],段地址默认在ds中,表示将ds * 16 + bx寄存器中地址+si寄存器中地址+10h,指向内存单元数据(2字节),存储到16位寄存器cx中。
MOV r16,r/m16指令相符,其操作码为8B /r。

查ModR/M表,以[bx+si]+disp8为行,以cx为列,交汇处48表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M偏移机器码
mov cx,[bx+si+10h]8B48108B4810

2.10 mov cx,[bx+0100h]

mov cx,[bx+0100h],段地址默认在ds中,表示将ds * 16 + bx寄存器中地址+0100h,指向内存单元数据(2字节),存储到16位寄存器cx中。
MOV r16,r/m16指令相符,其操作码为8B /r。

查ModR/M表,以[bx]+disp16为行,以cx为列,交汇处8F表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M偏移机器码
mov cx,[bx+0100h]8B8F01008B8F0001

2.11 mov cx,[bx+si+0100h]

mov cx,[bx+si+0100h],段地址默认在ds中,表示将ds * 16 + bx寄存器中地址+si寄存器中地址+0100h,指向内存单元数据(2字节),存储到16位寄存器cx中。
MOV r16,r/m16指令相符,其操作码为8B /r。

查ModR/M表,以[bx+si]+disp16为行,以cx为列,交汇处88表示ModR/M值。
因此指令的机器码组成,如下所示:

汇编指令操作码ModR/M偏移机器码
mov cx,[bx+si+0100h]8B8801008B880001

参考文档:

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: MIPS汇编指令在线转换机器码是一种在互联网上提供的工具,可以将MIPS汇编语言指令转换为对应的机器码。 MIPS汇编指令是一种低级语言,用于编写基于MIPS体系结构的计算机程序。它使用助记符和操作数来表示不同的指令,以便程序员更容易地理解和编写代码。然而,计算机硬件只能理解机器码,即由二进制数字表示的指令。 在线转换工具通过解析输入的MIPS汇编指令,将其转换机器码,以便计算机能够执行相应的操作。转换的过程涉及到识别和解析指令中的助记符和操作数,并根据MIPS指令集架构的规则将其转化为对应的机器码表示。 通过在线转换机器码的工具,程序员可以验证他们编写的汇编代码是否正确,并且可以理解每条指令在计算机内部的表示形式。此外,这个工具还可以帮助初学者学习和理解MIPS汇编语言的基本知识,并且能够快速转换并输出机器码。 总之,MIPS汇编指令在线转换机器码是一种方便的工具,可以将MIPS汇编指令转换为计算机能够理解和执行的机器码。它有助于程序员验证代码的正确性,并促进对MIPS汇编语言的学习和理解。 ### 回答2: MIPS(Microprocessor without Interlocked Pipeline Stages)汇编语言是一种基于RISC(Reduced Instruction Set Computer)架构的指令集,常用于嵌入式系统和计算机体系结构的学习中。MIPS汇编指令集较为简洁,有助于理解计算机底层的工作原理。 将MIPS汇编指令转换机器码是让计算机能够理解和执行指令的过程。通常,在进行这种转换时,需要参考MIPS指令集手册来确定每个指令的操作码(Opcode)、寄存器操作数(Register Operand)和立即数(Immediate Operand),以及一些其他可能的参数。 转换MIPS汇编指令机器码的过程可以分为以下几个步骤: 1. 根据指令的类型(例如,存储、加载、运算等),确定操作码。每个操作码对应一个特定的指令。 2. 根据指令中包含的寄存器操作数和立即数,确定相应的二进制表示。 3. 将操作码和操作数转换为二进制,并按照特定的顺序排列这些。 4. 组合确定指令格式的各个部分,生成完整的二进制机器码。 以MIPS的ADD(加法)指令为例,其汇编语言表示为"ADD r1, r2, r3",其中r1、r2和r3是寄存器。根据MIPS指令集手册,ADD指令的操作码是"000000",而r1、r2和r3分别对应于不同的寄存器编号,例如,r1为"00001"、r2为"00010"和r3为"00011"。因此,将ADD指令转换机器码时,操作码为"000000",寄存器操作数为"00001"、"00010"和"00011",其二进制表示为"000000 00001 00010 00011"。 如此类推,可以通过查找MIPS指令集手册中每个指令的相关信息,并遵循规定的转换流程,将所有MIPS汇编指令转换为对应的机器码。这样,计算机就能够根据转换后的机器码执行相应的指令,完成特定的任务。 ### 回答3: MIPS(Microprocessor without Interlocked Pipelined Stages)是一种常用的RISC(Reduced Instruction Set Computer)架构的计算机处理器。MIPS汇编语言是一种常用的底层编程语言,主要用于编写MIPS指令集架构的程序。 要将MIPS汇编指令转换机器码,可以使用在线工具或软件来实现。这些工具通常提供一个用户界面,让用户输入MIPS指令,并自动将其转换为相应的机器码。 在在线转换机器码的过程中,用户需要提供MIPS指令的正确写法和语法。例如,用户可以输入“add $t0, $t1, $t2”来表示将$t1和$t2寄存器中的值相加,并将结果存储在$t0寄存器中。转换工具会根据MIPS指令的操作码、寄存器编号等信息来生成相应的机器码。例如,对于上述的add指令,其对应的机器码可能是“000000 01001 01010 01000 00000 100000”。 在线转换机器码的工具通常支持多种类型的MIPS指令,包括算术操作指令、逻辑操作指令、数据传输指令等。用户可以根据自己的程序需求,在工具中选择相应的指令类型,并提供相应的操作数和操作码。 需要注意的是,在在线转换机器码之前,用户应该确保输入的MIPS指令是正确的,并符合MIPS指令集的规范。否则,转换过程可能会出现错误或生成无效的机器码。 总之,通过使用在线工具或软件,可以方便地将MIPS汇编指令转换机器码。这样的工具为开发人员提供了一种快速和准确地生成MIPS指令对应机器码的方法,有助于在MIPS架构的计算机处理器上编写和运行程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百里杨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值