程序集——系统调用写入返回 -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
值本身。
你的情况 38
是 ENOSYS: Function not implemented
。
但是你调用的是什么系统调用函数?让我们看看,函数号在发出 syscall
之前存储到 rax
(32 位的 eax
)并且你的程序加载......什么都没有!
您的 copy/paste:
中好像少了一行
movq , %rax ; use the write syscall
我正在尝试学习一些汇编,我从将文本输出到屏幕开始。我开始认为这可能是我的环境 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
值本身。
你的情况 38
是 ENOSYS: Function not implemented
。
但是你调用的是什么系统调用函数?让我们看看,函数号在发出 syscall
之前存储到 rax
(32 位的 eax
)并且你的程序加载......什么都没有!
您的 copy/paste:
中好像少了一行movq , %rax ; use the write syscall