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. Я "думаю", что будет работать на тебя.