64-разрядный формат Mach-O не поддерживает 32-разрядные абсолютные адреса. 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
Я действительно новичок в сборке и едва знаю, что делают эти команды. Любая идея, что здесь не так?
Ответы
Ответ 1
Mac OS X, как и другие системы UNIX/POSIX, использует другое соглашение о вызове для 64-битного кода. Вместо того, чтобы вызывать все аргументы в стек, он использует RDI
, RSI
, RDX
, RCX
, R8
и R9
для первых 6 аргументов. Поэтому вместо использования push msg
вам нужно использовать что-то вроде mov RDI, msg
.
Ответ 2
Кроме того, что указывает Дрю Макгоуэн, <0 > нужно обнулить (нет векторных параметров).
Но -f win64
или -f elf64
будут работать над этим кодом. Я подозреваю, что ошибка в -f macho64
(но я не уверен, что macho64
"должен" делать). Пока это не будет исправлено (?), Обходным путем является использование default rel
или mov rdi, rel msg
. Я "думаю", что будет работать на тебя.