无法将.data中的变量移动到Mac x86 Assembly的寄存器中

时间:2018-05-06 22:33:58

标签: macos assembly x86 x86-64 att

我用AT& T语法写了一小段程序集,目前在.data部分声明了三个变量。但是,当我尝试将任何这些变量移动到寄存器(例如%eax)时,会引发gcc的错误。代码和错误消息如下:

.data
  x:.int 14
  y:.int 4
  str: .string "some string\n"

.globl _main

_main:
  pushq %rbp
  movq %rsp, %rbp
  subq $16, %rsp
  movl x, %eax; #attempting to move the value of x to %eax;
  leave
  ret

引发的错误是:

  

call_function.s:14:3:错误:64位模式不支持32位绝对寻址

     

movl x,%eax;

     

^

我还尝试通过先在$前添加x字符来移动值,但是会引发clang错误:

  

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

有谁知道x中存储的值如何成功转移到%eax?我在Mac OSX上使用x86程序集并使用gcc进行编译。

1 个答案:

答案 0 :(得分:4)

RIP相对寻址模式是解决MacOS上静态数据的唯一好方法;图像基地址高于2 ^ 32,因此32位绝对地址即使在位置相关的代码中也不可用(与x86-64 Linux不同)。静态数据的RIP相对寻址与位置无关,因此它甚至可以在位置无关的可执行文件(ASLR)和库中工作。

movl x(%rip), %eax 是RIP相对的AT& T语法。

GAS中{p> mov eax, dword ptr [rip+x] .intel_syntax noprefix

或者,要将符号的地址放入寄存器, lea x(%rip), %rdi

NASM语法:mov eax, [rel x],或使用default rel,因此[x]与RIP相关。

有关您可以在OS X上执行的操作的更多背景信息,请参阅Mach-O 64-bit format does not support 32-bit absolute addresses. NASM Accessing Array,例如movabs x, %eax是可能的,因为目标寄存器是AL / AX / EAX / RAX。 (64位绝对地址,但不要这样做,因为它比RIP相对负载更大而且不快。)

另见http://felixcloutier.com/x86/MOV.html