无法使用 Mac x86 程序集将 .data 中的变量移动到寄存器

2023-12-04

我用 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.


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

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

mov eax, dword ptr [rip+x] in GAS .intel_syntax noprefix.

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


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

See Mach-O 64 位格式不支持 32 位绝对地址。 NASM 访问阵列了解更多关于您的背景can在 OS X 上执行,例如movabs x, %eax这是可能的,因为目标寄存器是 AL/AX/EAX/RAX。 (64 位绝对地址,但不要这样做,因为它比 RIP 相对加载更大且不快。)

也可以看看http://felixcloutier.com/x86/MOV.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Mac x86 程序集将 .data 中的变量移动到寄存器 的相关文章

随机推荐