我想制作汇编编译器。为此,我应该研究汇编操作码,所以我在网上找到了这个。当我测试用 NASM 编译一些代码时,像这样:
add eax, eax
它在二进制上输出:
6601C0
但是,当我看到 Assembly Opcodes 的引用时,它会显示以下屏幕:
其中 ADD 操作码为 00、01、02、03、04、05。 哪个操作码是正确的?我可以使用所有这些,还是应该使用 01(基于使用 NASM 编译的二进制文件)。
最佳答案
您找到的只是互联网上某人整理的一些引用。 权威引用来自英特尔,可在此下载:Intel® 64 and IA-32 Architectures Software Developer Manuals .
您显然为 16 位实模式环境(如 DOS)组装了代码,它被组装到 66
01
C0
.
看第一个字节
66
。这被英特尔称为“操作数大小覆盖前缀”,在您的引用文献中称为“OPSIZE”。它将操作数的大小从 16 位更改为 32 位(AX
到EAX
)。这就是为什么我猜环境是一个 16 位系统。第二个字节
01
是您引用中第一行第二个位置的ADD
指令。您的引用称它为ADD Ev Gv
。英特尔手册称其为ADD r/m16, r16
。使用操作数大小覆盖前缀,您可以将其读作ADD r/m32, r32
。第三个字节
C0
是您引用中的“Ev Gv”(英特尔:“r/m32, r32”)。英特尔称之为“ModR/M”字节。此字节中的一些位定义目标(“Ev”),一些位定义源(“Gv”)。查看 Intel 手册中的表“表 2-1。16 位寻址形式与 ModR/M 字节”。
要回答您的问题:不,您必须为特定目的使用特定的 ADD
指令。 ADD
指令执行不同的操作。
关于assembly - 如何阅读汇编操作码引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43153964/