无法将 .data 中的变量移动到 Mac x86 程序集的寄存器
Unable to move variables in .data to registers with Mac x86 Assembly
我用 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 , %rsp
movl x, %eax; #attempting to move the value of x to %eax;
leave
ret
引发的错误是:
call_function.s:14:3: error: 32-bit absolute addressing is not supported in 64-bit mode
movl x, %eax;
^
我也曾尝试通过首先在 x
前面添加 $
字符来移动值,但是,引发了 clang
错误:
clang: error: linker command failed with exit code 1 (use -v to see invocation)
有谁知道x
中存储的值如何成功移动到%eax
?我在 Mac OSX 上使用 x86 程序集并使用 gcc
.
进行编译
相对于 RIP 的寻址模式是在 Mac 上寻址静态数据的唯一好的选择OS;图像基地址高于 2^32,因此即使在位置相关代码中也不能使用 32 位绝对地址(与 x86-64 Linux 不同)。静态数据的 RIP 相对寻址与位置无关,因此即使在与位置无关的可执行文件 (ASLR) 和库中也能正常工作。
movl x(%rip), %eax
是 RIP-relative 的 AT&T 语法。
mov eax, dword ptr [rip+x]
在 GAS .intel_syntax noprefix
.
或者,要将符号的地址存入寄存器,lea x(%rip), %rdi
NASM 语法:mov eax, [rel x]
,或使用 default rel
所以 [x]
是 RIP 相关的。
请参阅 Mach-O 64-bit format does not support 32-bit absolute addresses. NASM Accessing Array 了解有关您 可以 在 OS X 上做什么的更多背景信息,例如movabs x, %eax
是可能的,因为目标寄存器是 AL/AX/EAX/RAX。 (64 位绝对地址,但不要这样做,因为它比 RIP 相对负载更大且速度不快。)
我用 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 , %rsp
movl x, %eax; #attempting to move the value of x to %eax;
leave
ret
引发的错误是:
call_function.s:14:3: error: 32-bit absolute addressing is not supported in 64-bit mode
movl x, %eax;
^
我也曾尝试通过首先在 x
前面添加 $
字符来移动值,但是,引发了 clang
错误:
clang: error: linker command failed with exit code 1 (use -v to see invocation)
有谁知道x
中存储的值如何成功移动到%eax
?我在 Mac OSX 上使用 x86 程序集并使用 gcc
.
相对于 RIP 的寻址模式是在 Mac 上寻址静态数据的唯一好的选择OS;图像基地址高于 2^32,因此即使在位置相关代码中也不能使用 32 位绝对地址(与 x86-64 Linux 不同)。静态数据的 RIP 相对寻址与位置无关,因此即使在与位置无关的可执行文件 (ASLR) 和库中也能正常工作。
movl x(%rip), %eax
是 RIP-relative 的 AT&T 语法。
mov eax, dword ptr [rip+x]
在 GAS .intel_syntax noprefix
.
或者,要将符号的地址存入寄存器,lea x(%rip), %rdi
NASM 语法:mov eax, [rel x]
,或使用 default rel
所以 [x]
是 RIP 相关的。
请参阅 Mach-O 64-bit format does not support 32-bit absolute addresses. NASM Accessing Array 了解有关您 可以 在 OS X 上做什么的更多背景信息,例如movabs x, %eax
是可能的,因为目标寄存器是 AL/AX/EAX/RAX。 (64 位绝对地址,但不要这样做,因为它比 RIP 相对负载更大且速度不快。)