汇编——系统调用 write 返回 -38,无输出

tra*_*day 0 linux assembly system-calls

我正在尝试学习一些汇编,并且我从将文本输出到屏幕开始。我开始认为这可能是我的环境和/或编译的问题:到目前为止,我非常沮丧,我实际上已经复制粘贴了汇编代码,但它只是不会调用系统调用。这是源代码(主要改编自https://en.wikibooks.org/wiki/X86_Assembly/Interface_with_Linux

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

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

    movq $60, %rax  # use the _exit syscall
    movq $0, %rdi   # error code 0
    syscall         # make syscall
Run Code Online (Sandbox Code Playgroud)

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

gcc -c test.s
gcc test.o -no-pie
Run Code Online (Sandbox Code Playgroud)

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

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

rod*_*igo 5

如果出现错误,系统调用通常会返回负值,绝对值就是值errno本身。

在你的情况下38ENOSYS: Function not implemented.

但是您正在调用什么系统调用函数?让我们看看,在发出 之前,函数编号被存储到raxeax以 32 位),syscall并且您的程序加载......什么也没有!

看起来您在复制/粘贴中丢失了一行:

movq $1, %rax   ; use the write syscall
Run Code Online (Sandbox Code Playgroud)

  • 在过去,我查看了“/usr/include”标头或“linux”标头。但现在我发现了一个名为“moreutils”的包,除了其他不错的工具之外,它还包含命令“errno”。只需运行“errno 38”,它就会为您完成艰苦的工作。 (2认同)