Nasm Hello World Bus错误OS X.

时间:2014-07-01 01:58:08

标签: macos assembly nasm

我有以下汇编代码(从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的添加是否不正确,还是我需要更改其他内容?

2 个答案:

答案 0 :(得分:4)

OSX上的64位系统调用需要在寄存器的位24..31中有一个类说明符,用于保存系统调用号(在您的情况下为rax)。您已隐式使用类说明符0 which is invalid

您可能需要UNIX / BSD类,这意味着您应该添加2<<240x2000000)。所以这些界限:

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位程序时没有任何意义。