assembly - 如何阅读汇编操作码引用?

标签 assembly x86 machine-code opcode instruction-encoding

我想制作汇编编译器。为此,我应该研究汇编操作码,所以我在网上找到了这个。当我测试用 NASM 编译一些代码时,像这样:

add eax, eax

它在二进制上输出:

6601C0

但是,当我看到 Assembly Opcodes 的引用时,它会显示以下屏幕: Snapshot

其中 ADD 操作码为 00、01、02、03、04、05。 哪个操作码是正确的?我可以使用所有这些,还是应该使用 01(基于使用 NASM 编译的二进制文件)。

最佳答案

您找到的只是互联网上某人整理的一些引用。 权威引用来自英特尔,可在此下载:Intel® 64 and IA-32 Architectures Software Developer Manuals .

您显然为 16 位实模式环境(如 DOS)组装了代码,它被组装到 66 01 C0.

  1. 看第一个字节66。这被英特尔称为“操作数大小覆盖前缀”,在您的引用文献中称为“OPSIZE”。它将操作数的大小从 16 位更改为 32 位(AXEAX)。这就是为什么我猜环境是一个 16 位系统。

  2. 第二个字节01 是您引用中第一行第二个位置的ADD 指令。您的引用称它为 ADD Ev Gv。英特尔手册称其为 ADD r/m16, r16。使用操作数大小覆盖前缀,您可以将其读作 ADD r/m32, r32

  3. 第三个字节 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/

相关文章:

assembly - 如何读取 NASM 汇编程序 .lst 列表文件

assembly - Asm 指令上的 INT 与 CALL

c++ - 将十六进制代码格式化为 asm 代码

gcc - 了解 gcc 生成的优化汇编代码

x86 - _mm_cmpistri 的模式 12

assembly - push 和 pop 在 assembly 中是如何工作的

assembly - 组装远调用或远跳转(j* 指令)

c - 为什么 a.out 不是机器语言?

assembly - 软件在什么阶段转换为实际的硬件信号?

assembly - ModRM : Can't use direct address, 组件 x86