为什么 mov eax,val 不是等价于 mov $val,%eax 的 Intel 语法?

Why is mov eax,val not the Intel-syntax equivalent of mov $val,%eax?

我正在尝试了解 Intel 语法和 AT&T 语法之间的区别(我使用 GNU 作为)。

我有两个文件,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    [=13=]x0,%eax

为什么不同?

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

    mov eax, offset val