【问题标题】:Nasm Hello World Bus Error OS XNasm Hello World 总线错误 OS X
【发布时间】:2014-07-01 01:58:08
【问题描述】:

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

【问题讨论】:

    标签: macos assembly nasm


    【解决方案1】:

    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 有什么作用,所以你可以删除那行。

    【讨论】:

    • "sub rsp, 8" 指令也可能会导致问题:在 Windows 中,如果堆栈未与 16 字节对齐,许多系统指令会导致崩溃。
    • @MartinRosenau 对不起,sub rsp, 8 在我尝试解决问题的一次尝试中被错误地留在那里。有趣的是,程序在有和没有指令的情况下都可以编译和运行。
    猜你喜欢
    • 2012-09-21
    • 2013-07-24
    • 2015-04-18
    • 1970-01-01
    • 2014-10-17
    • 2015-05-04
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多