我目前正在上一门低级编程课程,不幸的是,我在我们的教科书中找不到这些信息(大部分问题都没有包含在我们的课本中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似的东西”的信息。问题如下:
<块引用>给出每条指令的操作码和代码字节数。
(a) mov exc, 984 Op Code_____ 字节数_____
(b) xchg eax, ecx Op Code_____字节数_____
还有很多,但如果有人能帮助我理解如何做这两个,我希望能够将其转化为其他问题。
我尝试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 中创建了一个小的 *.asm 项目,并在 (a) 中添加了一行代码并查看了列表文件。我看到它显示以下内容:
<块引用>00000000 B9 000003D8 mov ecx, 984
我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。
答案 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 id
的 rd
是 ECX
,所以第一个字节是 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
在终端上打印列表。