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

A M*_*M C -1 x86 assembly 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   
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ger 5

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

完整的 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在终端上打印列表。