64位NASM mov错误

时间:2016-06-19 01:55:07

标签: assembly nasm

我正在尝试在我的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

1 个答案:

答案 0 :(得分:0)

来自NASM manual

  

使用MOV ALAXEAXRAX(但没有其他寄存器)加载或存储完整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