汇编 -- 系统调用写入返回 -38,无输出



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

.section .data
msg: .ascii "Hello Worldn"
.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

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

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

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

谁能给出见解?

系统调用通常在出错时返回负值,绝对值是errno值本身。

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

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

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

movq $1, %rax   ; use the write syscall

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

movq $1, %rax   ; use the write syscall

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

最新更新