【问题标题】:Why is mov eax,val not the Intel-syntax equivalent of mov $val,%eax?为什么 mov eax,val 不是 mov $val,%eax 的 Intel 语法等价物?
【发布时间】:2026-02-07 04:40:01
【问题描述】:

我试图了解 Intel 语法和 AT&T 语法之间的区别(我使用 GNU as)。

我有两个文件,intel.s:

.intel_syntax noprefix

val:
    mov eax, val

和atandt.s:

val:
    mov $val, %eax

我正在尝试将 AT&T 版本转换为 Intel 版本。但我得到不同的结果:

$ objdump -d intel.o

intel.o:     file format elf32-i386


Disassembly of section .text:

00000000 <val>:
   0:   a1 00 00 00 00          mov    0x0,%eax

$ objdump -d atandt.o

atandt.o:     file format elf32-i386


Disassembly of section .text:

00000000 <val>:
   0:   b8 00 00 00 00          mov    $0x0,%eax

它们为什么不同?

【问题讨论】:

  • 在 intel 语法中你应该使用mov eax, offset val 来加载地址。
  • c9x.me/x86/html/file_module_x86_id_176.html 一个是mov immediate,另一个是mov from dword
  • 感谢大家的帮助。现在明白了!
  • 这是.intel_syntax noprefix 与 NASM 语法不同的方式之一。它更像 MASM,它使用完全相同的 offset 关键字,其中一个普通符号是一个内存操作数。

标签: assembly x86 gnu-assembler att


【解决方案1】:

Intel 指令加载 val 的内容。要加载其地址,请使用

    mov eax, offset val

【讨论】:

    最近更新 更多