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

Give the opcode and number of bytes of code for each of these instructions

我目前正在学习低级编程class,不幸的是,我无法在我们的课本中找到这些信息(大部分问题都没有包含在我们的课文中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似内容”的信息。题目如下:

Give the op code and number of bytes of code for each of these instructions.
(a) mov exc, 984 Op Code_____ Number of Bytes_____
(b) xchg eax, ecx Op Code_____ Number of Bytes_____

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

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

00000000  B9 000003D8         mov  ecx, 984   

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

每当您对指令编码有疑问时,请检查指令参考,例如 AMD 或 Intel's Manuals. Specifically, Volume 2 of Intel's manual applies here. A web-browsable version like https://www.felixcloutier.com/x86/ 从 PDF 中删除。

完整的 PDF 包含介绍性章节,解释了个别说明条目中使用的符号。相关问答:

  • How to read the Intel Opcode notation
  • What does the /4 mean in FF /4?(与您询问的任一特定指令的编码无关,但其他指令将 /r 字段作为额外的操作码位)。

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

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

也可以 assemble 将其作为 2 个字节,这是一个特定的在线 assembler 为我所做的,但其中一个操作数是 EAX允许 1 字节版本。


对于 mov ecx, 984(我假设 exc 是错字)我们检查 MOV 部分,并在 [=75] 中找到指令 MOV r32, imm32 =] 那里,编码为 B8+rd id。从另一个,我们已经知道 rd for ECX1,所以第一个字节是 B9.

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

放在一起,编码指令为B9 D8 03 00 00.


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


您可以通过使用任何 assembler(例如 NASM)并要求其制作“列表”来验证这些。点赞 nasm -felf32 foo.asm -l /dev/stdout 以在终端上打印列表。