当我使用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
我对装配很陌生,几乎不知道这些命令是做什么的。知道这里有什么问题吗?
答案 0 :(得分:3)
与其他UNIX / POSIX系统一样,Mac OS X对64位代码使用不同的调用约定。它不是将所有参数都推送到堆栈,而是使用RDI
,RSI
,RDX
,RCX
,R8
和R9
前6个论点。因此,您需要使用push msg
。
mov RDI, msg
答案 1 :(得分:0)
除了Drew McGowen所指出的,rax
需要归零(没有矢量参数)。
但-f win64
或-f elf64
适用于此代码。我怀疑-f macho64
中存在错误(但我不确定macho64
是什么"假设"要做什么)。在此问题得到修复(?)之前,解决方法是使用default rel
或mov rdi, rel msg
。我认为"那将为你工作。