我正在尝试在我的64位MacBook Pro上自学NASM。我已经正常编译并运行了典型的Hello World程序。
我尝试按照此处的代码进行一些简单的算术... http://www.csee.umbc.edu/portal/help/nasm/intarith_64.asm
但是我无法完成一项简单的工作。当我尝试使用nasm -f macho64 filename.asm
编译它时,我收到以下消息:
error: Mach-O 64-bit format does not support 32-bit absolute addresses
引用了mov [b], rax
行。有没有人对如何克服这个问题有任何建议?
global start
section .data
a: dq 1
section .bss
b: resq 1
section .text
start:
mov rax, [a]
mov [b], rax
答案 0 :(得分:0)
来自NASM manual:
使用
MOV AL
,AX
,EAX
或RAX
(但没有其他寄存器)加载或存储完整64位移位的唯一指令一个绝对的64位地址。由于这是一个相对较少使用的指令(64位代码通常使用相对寻址),程序员必须明确声明位移大小为QWORD
:
default abs
mov eax,[foo] ; 32-bit absolute disp, sign-extended
mov eax,[a32 foo] ; 32-bit absolute disp, zero-extended
mov eax,[qword foo] ; 64-bit absolute disp
default rel
mov eax,[foo] ; 32-bit relative disp
mov eax,[a32 foo] ; d:o, address truncated to 32 bits(!)
mov eax,[qword foo] ; error
mov eax,[abs qword foo] ; 64-bit absolute disp