NASM编译得很好,但是当我使用YASM时,我收到以下错误:
hello.asm:12:错误:男子气概:抱歉,无法应用32位绝对值 在64位模式下重定位,考虑mem的“[_symbol wrt rip]” 访问,“qword”和“dq _foo”指针。
生成文件
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
hello.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不会那么奖励。
答案 0 :(得分:2)
我得到了它的工作。在yasm
中,您必须明确告诉它地址是64位的:
mov rsi, qword hello
文档讨论了这里的情况:https://github.com/yasm/yasm/wiki/AMD64