程序集——系统调用写入返回 -38,无输出

Assembly -- syscall write returning -38, no output

我正在尝试学习一些汇编,我从将文本输出到屏幕开始。我开始认为这可能是我的环境 and/or 编译:到现在为止,我非常沮丧,以至于我确实复制粘贴了汇编代码,但它不会调用系统调用。这里是源码(主要改编自https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux

.section .data
msg: .ascii "Hello World\n"
.section .text

.global main
main: 
    movq , %rdi   # write to stdout
    movq $msg, %rsi # use string "Hello World"
    movq , %rdx  # write 12 characters
    syscall         # make syscall

    movq , %rax  # use the _exit syscall
    movq [=10=], %rdi   # error code 0
    syscall         # make syscall

我在 64 位机器上 运行 Kali Linux,并且正在使用 GCC 进行编译。像这样:

gcc -c test.s
gcc test.o -no-pie

我用 GDB 调试了程序,系统调用指令总是将 eax 寄存器设置为 0xffffffffffffffda (-38),这似乎不正确...

任何人都可以提供见解吗?

您的代码缺少示例代码中的第一条指令:

movq , %rax   ; use the write syscall

如果没有此代码,它最终会根据调用 main 时发生在 %rax 中的任何内容执行意外(并且可能无效)的系统调用。

系统调用通常 return 出现错误时的负值,绝对值是 errno 值本身。

你的情况 38ENOSYS: Function not implemented

但是你调用的是什么系统调用函数?让我们看看,函数号在发出 syscall 之前存储到 rax(32 位的 eax)并且你的程序加载......什么都没有!

您的 copy/paste:

中好像少了一行
movq , %rax   ; use the write syscall