给出每条指令的操作码和代码字节数

时间:2021-07-28 13:19:41

标签: assembly x86 instruction-encoding

我目前正在上一门低级编程课程,不幸的是,我在我们的教科书中找不到这些信息(大部分问题都没有包含在我们的课本中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似的东西”的信息。问题如下:

<块引用>

给出每条指令的操作码和代码字节数。
(a) mov exc, 984 Op Code_____ 字节数_____
(b) xchg eax, ecx Op Code_____字节数_____

还有很多,但如果有人能帮助我理解如何做这两个,我希望能够将其转化为其他问题。

我尝试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 中创建了一个小的 *.asm 项目,并在 (a) 中添加了一行代码并查看了列表文件。我看到它显示以下内容:

<块引用>
00000000  B9 000003D8         mov  ecx, 984   

我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。

1 个答案:

答案 0 :(得分:5)

每当您对指令编码有疑问时,请检查指令参考,例如 AMD 或 Intel's Manuals。具体来说,英特尔手册的第 2 卷适用于此。像 https://www.felixcloutier.com/x86/ 这样的网络浏览版本是从该 PDF 中抓取的。

完整的 PDF 有介绍章节,解释了各个指令条目中使用的符号。相关问答:


对于 xchg eax, ecx,我们检查 XCHG section in the manual。在表中,我们想要的指令是 XCHG EAX, r32。它被编码为 90+rd(这里的 90 是十六进制),其中 rd 是指定使用哪个双字寄存器的代码。

查看手册的前面(就在完整 PDF 中指令集参考章节的开头),我们找到了 +rd 的定义,并看到 ECX 的值为 {{ 1}}。因此,1 的紧凑单字节编码是 xchg eax, ecx(同样是十六进制)。

也可以将其组装为 2 个字节,这是一个特定的在线汇编器为我所做的,但操作数之一是 91 的事实允许使用 1 个字节的版本。


对于 EAX(我假设 mov ecx, 984 是一个错字)我们检查 exc 部分,并在那里的表中找到指令为 MOV,编码为MOV r32, imm32。从另一个,我们已经知道 B8+rd idrdECX,所以第一个字节是 1

然后我们有 B9,并检查我们找到 id 的同一部分,我们知道这是一个 4 字节的立即有符号操作数,首先作为低位字节(小端)给出。将 +rd 从十进制转换为十六进制,我们得到 984。以 4 个字节作为小端编码,这是 3D8

综合起来,编码后的指令是D8 03 00 00


(有趣的事实:x86 寄存器以 EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI 编号。前 4 个不是按字母顺序排列的,可能是 obscure historical reasons。)


您可以使用任何汇编器(如 NASM)来验证这些,并要求它进行“列表”。喜欢 B9 D8 03 00 00 在终端上打印列表。

相关问题