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),这似乎不正确......
任何人都可以提供见解吗?
如果出现错误,系统调用通常会返回负值,绝对值就是值errno本身。
在你的情况下38是ENOSYS: Function not implemented.
但是您正在调用什么系统调用函数?让我们看看,在发出 之前,函数编号被存储到rax(eax以 32 位),syscall并且您的程序加载......什么也没有!
看起来您在复制/粘贴中丢失了一行:
movq $1, %rax ; use the write syscall
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1032 次 |
| 最近记录: |