给出每条指令的操作码和代码字节数
Give the opcode and number of bytes of code for each of these instructions
我目前正在学习低级编程class,不幸的是,我无法在我们的课本中找到这些信息(大部分问题都没有包含在我们的课文中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似内容”的信息。题目如下:
Give the op code and number of bytes of code for each of these instructions.
(a) mov exc, 984 Op Code_____ Number of Bytes_____
(b) xchg eax, ecx Op Code_____ Number of Bytes_____
还有很多,但如果有人能帮助我理解如何做这两个问题,我希望能够将其转化为其他问题。
我试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 年创建了一个小型 *.asm 项目并在 (a) 中添加了一行代码并查看了列表文件.我看到它显示以下内容:
00000000 B9 000003D8 mov ecx, 984
我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。
每当您对指令编码有疑问时,请检查指令参考,例如 AMD 或 Intel's Manuals. Specifically, Volume 2 of Intel's manual applies here. A web-browsable version like https://www.felixcloutier.com/x86/ 从 PDF 中删除。
完整的 PDF 包含介绍性章节,解释了个别说明条目中使用的符号。相关问答:
- How to read the Intel Opcode notation
- What does the /4 mean in FF /4?(与您询问的任一特定指令的编码无关,但其他指令将 /r 字段作为额外的操作码位)。
对于 xchg eax, ecx
,我们检查 XCHG
section in the manual。在 table 中,我们想要的指令是 XCHG EAX, r32
。它被编码为 90+rd
(90
这里是十六进制),其中 rd
是指定使用哪个双字寄存器的代码。
查看手册前面的内容(就在完整 PDF 中指令集参考章节的开头),我们找到 +rd
的定义,并看到 ECX
的值为1
。 xchg eax, ecx
的紧凑单字节编码因此是 91
(同样是十六进制)。
也可以 assemble 将其作为 2 个字节,这是一个特定的在线 assembler 为我所做的,但其中一个操作数是 EAX
允许 1 字节版本。
对于 mov ecx, 984
(我假设 exc
是错字)我们检查 MOV
部分,并在 [=75] 中找到指令 MOV r32, imm32
=] 那里,编码为 B8+rd id
。从另一个,我们已经知道 rd
for ECX
是 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 个不是按字母顺序排列的,可能是 obscure historical reasons。)
您可以通过使用任何 assembler(例如 NASM)并要求其制作“列表”来验证这些。点赞 nasm -felf32 foo.asm -l /dev/stdout
以在终端上打印列表。
我目前正在学习低级编程class,不幸的是,我无法在我们的课本中找到这些信息(大部分问题都没有包含在我们的课文中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似内容”的信息。题目如下:
Give the op code and number of bytes of code for each of these instructions.
(a) mov exc, 984 Op Code_____ Number of Bytes_____
(b) xchg eax, ecx Op Code_____ Number of Bytes_____
还有很多,但如果有人能帮助我理解如何做这两个问题,我希望能够将其转化为其他问题。
我试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 年创建了一个小型 *.asm 项目并在 (a) 中添加了一行代码并查看了列表文件.我看到它显示以下内容:
00000000 B9 000003D8 mov ecx, 984
我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。
每当您对指令编码有疑问时,请检查指令参考,例如 AMD 或 Intel's Manuals. Specifically, Volume 2 of Intel's manual applies here. A web-browsable version like https://www.felixcloutier.com/x86/ 从 PDF 中删除。
完整的 PDF 包含介绍性章节,解释了个别说明条目中使用的符号。相关问答:
- How to read the Intel Opcode notation
- What does the /4 mean in FF /4?(与您询问的任一特定指令的编码无关,但其他指令将 /r 字段作为额外的操作码位)。
对于 xchg eax, ecx
,我们检查 XCHG
section in the manual。在 table 中,我们想要的指令是 XCHG EAX, r32
。它被编码为 90+rd
(90
这里是十六进制),其中 rd
是指定使用哪个双字寄存器的代码。
查看手册前面的内容(就在完整 PDF 中指令集参考章节的开头),我们找到 +rd
的定义,并看到 ECX
的值为1
。 xchg eax, ecx
的紧凑单字节编码因此是 91
(同样是十六进制)。
也可以 assemble 将其作为 2 个字节,这是一个特定的在线 assembler 为我所做的,但其中一个操作数是 EAX
允许 1 字节版本。
对于 mov ecx, 984
(我假设 exc
是错字)我们检查 MOV
部分,并在 [=75] 中找到指令 MOV r32, imm32
=] 那里,编码为 B8+rd id
。从另一个,我们已经知道 rd
for ECX
是 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 个不是按字母顺序排列的,可能是 obscure historical reasons。)
您可以通过使用任何 assembler(例如 NASM)并要求其制作“列表”来验证这些。点赞 nasm -felf32 foo.asm -l /dev/stdout
以在终端上打印列表。