Así que estoy aprendiendo el ensamblado nasm x86_64 en mi mac por diversión. Después de hello world y algo de aritmética básica, intenté copiar un programa de hello world ligeramente más avanzado de this site y modificarlo para intel de 64 bits, pero no puedo deshacerme de este mensaje de error: hello.s:53: error: Mach-O 64-bit format does not support 32-bit absolute addresses
. Aquí está el comando que uso para ensamblar y vincular: nasm -f macho64 hello.s && ld -macosx_version_min 10.6 hello.o
. Y aquí está la línea correspondiente:Error del ensamblador: Mach-O 64 bit no admite direcciones absolutas de 32 bit
cmp rsi, name+8
RSI es el registro que estoy usando para mi índice en el bucle, y el nombre es una palabra de cuatro reservado para la entrada del usuario, que es el nombre, que a estas alturas ya ha sido escrito.
Aquí está una parte del código (ver el resto, haga clic en el enlace para ir a la parte inferior, la única diferencia es que yo uso 64 registros bits):
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
¿Cómo se define 'name'? – bdonlan
Una sugerencia: intente escribir el mismo código en C, compilarlo con 'gcc -S' y observar el conjunto para ver cómo lo maneja GCC. – Nemo
@bdonlan: en la sección .bss, tengo 'name: resb 8' – mk12