2017-08-03 105 views
0

我想学习一些程序集,并开始通过输出文本到屏幕上。我开始认为这可能是我的环境和/或编译:到现在为止,我非常沮丧,因为我真的是复制粘贴的汇编代码,但它不会调用系统调用。这里是源代码(主要改编自https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux大会 - 系统调用写返回-38,没有输出

.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 

我运行Linux的卡莉在64位机器上,和我用gcc编译。像这样:

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

我调试的程序与GDB和系统调用指令始终将EAX寄存器0xffffffffffffffda(-38),这看起来不正确...

谁能给一个洞察力?

回答

4

系统调用通常会在出现错误时返回负值,其绝对值为errno值本身。

您的情况38ENOSYS: Function not implemented

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

它看起来像你迷失在你的复制/粘贴一行:

movq $1, %rax ; use the write syscall 
+0

哦,我这么愚蠢有时会...我想我需要休息我的眼睛有点:)。总之,还有一件事:系统调用错误代码的参考是什么?你怎么知道38等同于ENOSYS? – travisjayday

+0

Nvm,我找到了它们:http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html – travisjayday

+1

在过去,我通过'/ usr/include'头文件或'linux '的。但是现在我发现了一个名为'moreutils'的软件包,其中包含一个命令errno。只要运行'errno 38'就可以了。 – rodrigo

2

你的代码是缺少从示例代码中的第一个指令:

movq $1, %rax ; use the write syscall 

没有这个代码,它结束了执行意想不到的(也可能是无效的)系统调用的基础上,无论发生在在%raxmain被调用。