困惑的是x86 MOV指令

时间:2014-07-22 12:58:34

标签: assembly x86 mov

来自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

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

1 个答案:

答案 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])。

相关问题