【问题标题】:Give the opcode and number of bytes of code for each of these instructions给出每条指令的操作码和代码字节数
【发布时间】:2021-07-28 13:19:41
【问题描述】:

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

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

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

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

00000000  B9 000003D8         mov  ecx, 984   

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

【问题讨论】:

  • x86 机器指令的编码请参考指令集参考。 Visual Studio 为您提供了反汇编,但它似乎将立即数显示为 32 位数字,这可能有点混淆(即您通常将mov ecx, 984 的编码作为b9 d8 03 00 00 而不是b9 000003d8)。但总体方法是合理的。组装有问题的指令,然后向反汇编程序询问编码或查看列表是一个好方法。
  • 这是有道理的。谢谢你。感谢您的帮助和信息:-)
  • @fuz:instruction-encoding 是新标签吗?对于这样的问题,我一直只使用machine-code;我不确定我们是否需要一个单独的标签来解决有关如何编码指令的问题,尽管这可能是与其他与基本无关的机器代码问题不同的问题。
  • @PeterCordes 这不是我做的标签,我只是发现它正在寻找合适的东西。
  • @fuz: 好吧,如果 [机器代码] 还有其他主要用途,除了特定指令的编码方式/机器代码的工作方式之外,那么是的,有一个单独的标签是有用的.我们可以在其中一些 [机器代码] 问答中添加或替换它。

标签: assembly x86 instruction-encoding


【解决方案1】:

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

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


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

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

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


对于mov ecx, 984(我假设exc 是错字),我们检查MOV 部分,并在表中找到MOV r32, imm32 的指令,编码为B8+rd id。从另一个我们已经知道ECXrd1,所以第一个字节是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。)


您可以通过使用任何汇编程序(例如 NASM)并要求它进行“列表”来验证这些。喜欢nasm -felf32 foo.asm -l /dev/stdout 在终端上打印一个列表。

【讨论】:

  • 感谢您的帮助。这完美地解释了这种情况,我非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多