NASM прекрасно компилируется, но когда я использую YASM, я получаю следующую ошибку:
hello.asm:12: error: macho: извините, нельзя применять 32-битные абсолютные перемещения в 64-битном режиме, рассмотрите «[_symbol wrt rip]» для доступа к памяти, «qword» и «dq _foo» для указателей.
Makefile
test: hello
./hello
hello:
yasm -f macho64 hello.asm
ld -o hello hello.o
clean:
rm *.o *.core hello
system.inc
%define stdin 0
%define stdout 1
%define stderr 2
%define SYS_nosys 0
%define SYS_exit 1
%define SYS_fork 2
%define SYS_read 3
%define SYS_write 4
section .text
align 4
access.the.osx.kernel:
syscall
ret
%macro system 1
mov rax, %1
call access.the.osx.kernel
%endmacro
%macro sys.exit 0
system SYS_exit
%endmacro
%macro sys.write 0
system SYS_write
%endmacro
привет.asm
%include 'system.inc'
section .data
hello db 'Hello, World!', 0Ah
hbytes equ $-hello
section .text
global start
start:
mov rax, 0x2000004
mov rdi, stdout
mov rsi, hello
mov rdx, hbytes
syscall
;sys.write
xor rdi, rdi
mov rax, 0x2000001
syscall
;sys.exit
Кто-нибудь знает, что происходит? И если бы вы могли объяснить, почему NASM работает, а YASM — нет, это было бы бонусом.
lea rsi, hello
илиmov rsi, offset hello
или что-то в этом роде. - person Igor Skochinsky   schedule 15.01.2013default rel
может исправить это. Подробнее здесь: tortall.net/projects/yasm/manual/ html/nasm-effaddr.html - person harold   schedule 15.01.2013