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) 中添加了一行代码并查看了列表文件。我看到它显示以下内容:
Run Code Online (Sandbox Code Playgroud)00000000 B9 000003D8 mov ecx, 984
我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。
每当您对指令编码有疑问时,请查看指令参考资料,例如 AMD 或Intel 的手册。具体来说,英特尔手册的第 2 卷适用于此。从该 PDF 中抓取了一个可浏览的网络版本,如https://www.felixcloutier.com/x86/。
完整的 PDF 有介绍章节,解释了个别指令条目中使用的符号。相关问答:
因为xchg eax, ecx我们检查XCHG手册中的部分。在表中,我们想要的指令是XCHG EAX, r32。它被编码为90+rd(90这里是十六进制),其中rd是指定使用哪个双字寄存器的代码。
在手册的前面(在完整 PDF 的指令集参考章节的开头),我们找到了 的定义+rd,并且看到它ECX的值为1。因此,紧凑的单字节编码xchg eax, ecx是91(再次,十六进制)。
也可以将其组装为 2 个字节,这是一个特定的在线汇编器为我所做的,但其中一个操作数EAX允许使用 1 字节版本这一事实。
对于mov ecx, 984(我假设exc是一个错字),我们检查了该MOV部分,并找到MOV r32, imm32了表中的指令,编码为B8+rd id. 从另一个,我们已经知道rdforECX是1,所以第一个字节是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在终端上打印列表。
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |