0

从 Intel64 和 IA-32 手册第 2a 卷中,有许多可能的指令用法mov。如:

mov r64, m64      # move m64 to r64

mov rax, moffs64  # move quadword at (offset) to RAX

我编写了代码来测试(gas,intel 语法):

movabs rax, label

movabs rax, offset label

...
label:
    .quad 0x112233445566

在组装、链接和 objdump 之后,我得到了相关的组装:

mov rax, qword ptr ds:0xffff80000000008e
mov rax, 0xffff80000000008e

显然,我写的第二条指令不是预期的手动指令。手册中的格式说明是什么?

4

1 回答 1

2

moffs表示内存操作数。以下是英特尔手册中的描述:

moffs8, moffs16, moffs32, moffs64MOV— 由指令的某些变体使用的字节、字或双字类型的简单内存变量(内存偏移) 。实际地址由相对于段基的简单偏移量给出。指令中不ModR/M使用字节。显示的数字moffs 表示其大小,由指令的地址大小属性决定。

MASM 和 TASM 等汇编程序使用的offset运算符为您提供“[操作数]相关段的偏移量” (来源)。所以你得到的offset label是 的偏移量label,它是一个立即值。所以你在看两个不同的东西:获取存储在特定地址的值,而不是获取地址本身。

我不知道获取moffs64变体的 GAS 语法是什么,但是使用 NASM 你可以编写mov rax,[qword label](注意,这种编码会比你简单地编写mov rax,[label]- 即更长mov r64, r/m64)。

于 2014-07-22T13:15:36.313 回答