来自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
显然,我写的第二条指令不是预期的手册。手册中格式的说明是什么?
答案 0 :(得分:1)
moffs
表示内存操作数。以下是英特尔手册中的说明:
moffs8, moffs16, moffs32, moffs64
- 字节,字或类型的简单内存变量(内存偏移量)MOV
指令的某些变体使用的双字。实际地址由简单的偏移量给出 相对于细分基础。指令中不使用ModR/M
个字节。moffs
显示的数字 表示其大小,由指令的address-size属性决定。
由MASM和TASM等汇编程序使用的offset
运算符为“提供了[操作数] (source)的相关段的偏移量。所以offset label
得到的是label
的偏移量,它是一个立即值。所以你要看两个不同的东西:获取存储在特定地址的值,而不是获取地址本身。
我不知道获取moffs64
变体的GAS语法是什么,但是使用NASM,您可以编写mov rax,[qword label]
(请注意,此编码将比您编写的{更长] { {1}} - 即mov rax,[label]
)。