Więc uczę się montażu nasm x86_64 na moim macu dla zabawy. Po witaniu świata i podstawowej arytmetyki, próbowałem skopiować nieco bardziej zaawansowany program na świecie od this site i modyfikując go na 64-bitową intel, ale nie mogę pozbyć się tego jednego komunikatu o błędzie: hello.s:53: error: Mach-O 64-bit format does not support 32-bit absolute addresses
. Oto polecenie, którego używam do złożenia i połączenia: nasm -f macho64 hello.s && ld -macosx_version_min 10.6 hello.o
. I tu jest odpowiednia linia:Błąd assemblera: Mach-O 64-bit nie obsługuje adresów bezwzględnych 32-bitowych
cmp rsi, name+8
RSI jest rejestrem używam mojego indeksu w pętli, a nazwa jest słowem quad zarezerwowane dla danych wprowadzonych przez użytkownika, który jest nazwą, która przez ten punkt ma już został napisany.
Oto część kodu (aby zobaczyć resztę, kliknij link i przejść do sedna, jedyną różnicą jest to, że mogę korzystać z 64 rejestrów bitowych):
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
Jak zdefiniowano "name"? – bdonlan
Jedna z propozycji: spróbuj wpisać ten sam kod w C, skompiluj go za pomocą 'gcc -S' i spójrz na zestaw, aby zobaczyć, jak GCC go obsługuje. – Nemo
@bdonlan: w sekcji .bss, mam 'name: resb 8' – mk12