Mach-O 64位格式不支持32位绝对地址。 NASM

时间:2014-10-16 00:28:32

标签: macos assembly nasm

当我使用nasm -f macho64 asm1.asm时,我收到以下错误:

  

asm1.asm:14:错误:Mach-O 64位格式不支持32位绝对地址

这是asm1.asm

SECTION .data           ;initialized data

msg: db "Hello world, this is assembly", 10, 0

SECTION .text           ;asm code

extern printf
global _main

_main:
    push rbp
    mov rbp, rsp

    push msg
    call printf

    mov rsp, rbp
    pop rbp
    ret

我对装配很陌生,几乎不知道这些命令是做什么的。知道这里有什么问题吗?

2 个答案:

答案 0 :(得分:3)

与其他UNIX / POSIX系统一样,Mac OS X对64位代码使用不同的调用约定。它不是将所有参数都推送到堆栈,而是使用RDIRSIRDXRCXR8R9前6个论点。因此,您需要使用push msg

之类的内容,而不是使用mov RDI, msg

答案 1 :(得分:0)

除了Drew McGowen所指出的,rax需要归零(没有矢量参数)。

-f win64-f elf64适用于此代码。我怀疑-f macho64中存在错误(但我不确定macho64是什么"假设"要做什么)。在此问题得到修复(?)之前,解决方法是使用default relmov rdi, rel msg。我认为"那将为你工作。