我对汇编中的linux x86系统调用有疑问。
当我在linux上使用nasm创建一个新的汇编程序时,我想知道我必须使用哪些系统调用来执行特定任务(例如,读取文件,编写输出或简单退出... )。我知道一些系统调用,因为我已经在互联网上的一些例子中读过它们(例如eax = 0,ebx = 1 int 0x80 exit,返回值为1),但仅此而已...我怎么知道是否还有其他退出系统调用的参数?或者另一个系统调用?我正在寻找一个文档来解释哪些系统调用具有哪些参数传递给哪些寄存器。
我已阅读有关退出功能等的手册页,但它没有向我解释我在问什么。
希望我很清楚,
谢谢!
答案 0 :(得分:2)
x86 wiki(我刚刚再次更新:)有系统调用ABI的链接(每次调用的数字,放置参数的位置,运行的指令以及哪些寄存器将被破坏回来)。手册页中未记录这一点,因为它是特定于体系结构的。二进制常量也是如此:它们不必在每个架构上都相同。
对于您的目标架构,grep
中O_APPEND
的 /usr/include
。
更好的方法是进行设置,以便在asm源中使用符号常量,以提高可读性并避免出错的风险。
gcc在处理.S
文件时实际上确实使用了C预处理器,但是包含大多数C头文件也会得到一些C原型。
或者使用#define
或其他内容将sed
转换为NASM宏。也许
printf '#include <%s>\n' unistd.h sys/stat.h |
gcc -dD -E - |
sed -ne 's/^#define \([A-Za-z_0-9]*\) \(.\)/\1\tequ \2/p'
将每个非空#define
变为NASM symbol equ value
。当我尝试在其上运行NASM时,生成的文件有许多行error: expression syntax error
,但手动从中选择一些有效行可能有效。
一些常数以多个步骤定义,例如: #define S_IRGRP (S_IRUSR >> 3)
。转换为NASM equ
符号定义时,这可能有效,也可能无效。
答案 1 :(得分:0)
也许你正在寻找类似linux / syscalls.h [1]的东西,如果你已经通过apt-get或发行版使用的任何东西安装了Linux源代码,那么你的系统就已经存在了。
[1] http://lxr.free-electrons.com/source/include/linux/syscalls.h#L326