我正在尝试学习一些汇编,我从将文本输出到屏幕上开始。我开始认为这可能是我的环境和/或编译:到目前为止,我很沮丧,以至于我已经复制粘贴了汇编代码,但它只是不会调用系统调用。这是源代码(主要改编自 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
值本身。
在您的情况下38
ENOSYS: Function not implemented
.
但是你调用的是什么系统调用函数?让我们看看,在发出syscall
之前,函数号被存储到rax
(eax
以 32 位为单位(并且您的程序加载...无!
看起来您在复制/粘贴中丢失了一行:
movq $1, %rax ; use the write syscall
您的代码缺少示例代码中的第一条指令:
movq $1, %rax ; use the write syscall
如果没有此代码,它最终会执行意外(并且可能无效(的系统调用,基于调用main
时%rax
中发生的任何内容。