-1

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

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

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

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

00000000  B9 000003D8         mov  ecx, 984   

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

4

1 回答 1

4

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

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


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

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

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


对于mov ecx, 984(我假设exc是一个错字)我们检查该MOV部分,并在那里找到表中的指令MOV r32, imm32,编码为B8+rd id. 从另一个,我们已经知道rdforECX1,所以第一个字节是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 个由于历史原因可能不按字母顺序排列。)


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

于 2021-07-28T14:07:47.370 回答