我有以下汇编代码(从here复制):
hello.asm
:
section .data
msg: db 'hello, world!', 0
section .text
global _start
_start:
mov rax, 4
mov rdi, 1
mov rsi, qword msg ; I added qword because the compiler complained
mov rdx, 13
syscall
mov rax, 1
xor rdi, rdi
syscall
正如上面的评论中所解释的,我添加了qword
,因为我收到了以下错误消息:
$ yasm -f macho64 hello.asm
hello.asm:10: error: macho: sorry, cannot apply 32 bit absolute relocations in 64 bit mode, consider "[_symbol wrt rip]" for mem access, "qword" and "dq _foo" for pointers.
进行更改后,编译和链接都成功,但运行时遇到总线错误:
$ yasm -f macho64 hello.asm
$ ld -o hello -e _start hello.o
$ ./hello
bus error ./hello
qword
的添加是否不正确,还是我需要更改其他内容?
答案 0 :(得分:4)
OSX上的64位系统调用需要在寄存器的位24..31中有一个类说明符,用于保存系统调用号(在您的情况下为rax
)。您已隐式使用类说明符0 which is invalid。
您可能需要UNIX / BSD类,这意味着您应该添加2<<24
(0x2000000
)。所以这些界限:
mov rax, 4
mov rax, 1
应更改为:
mov rax, 0x2000004
mov rax, 0x2000001
另外,我没有看到最后sub rsp, 8
的用途是什么,所以你可以删除该行。
答案 1 :(得分:0)
mov rsi,qword msg
这是错误的:通过添加&#34; qword&#34;你告诉汇编器加载位于地址&#34; msg&#34;的64位字。进入RSI而不是&#34; msg&#34;本身。
以下说明可能有效:
lea rsi,msg
但是我担心问题出在其他地方:
您必须找出重定位为&#34; 32位绝对重定位的原因&#34;。这在组装64位程序时没有任何意义。