Итак, я изучаю сборку nasm x86_64 на своем Mac для развлечения. После hello world и некоторой базовой арифметики я попытался скопировать чуть более продвинутую программу hello world с этого сайта и модифицировать ее для 64-битной Intel , но я не могу избавиться от этого сообщения об ошибке: hello.s: 53: error: 64-разрядный формат Mach-O не поддерживает 32-разрядные абсолютные адреса
. Вот Команда, которую я использую для сборки и компоновки: nasm -f macho64 hello.s && ld -macosx_version_min 10.6 hello.o
. И вот соответствующая строка:
cmp rsi, name+8
rsi - это регистр, который я использую для своего индекса в цикле, а name - это четверное слово, зарезервированное для пользовательского ввода, которое является именем, которое к этому моменту уже было записано.
Вот часть кода (чтобы увидеть остальное, щелкните ссылку и перейдите в конец, единственная разница в том, что я использую 64-битные регистры):
loopAgain:
mov al, [rsi] ; al is a 1 byte register
cmp al, 0x0a ; if al holds an ascii newline...
je exitLoop ; then jump to label exitLoop
; If al does not hold an ascii newline...
mov rax, 0x2000004 ; System call write = 4
mov rdi, 1 ; Write to stdout = 1
mov rdx, 1 ; Size to write
syscall
inc rsi
cmp rsi, name+8 ; LINE THAT CAUSES ERROR
jl loopAgain