我有一个关于汇编中的 linux x86 系统调用的问题。
当我在 Linux 上使用 nasm 创建新的汇编程序时,我想知道必须使用哪些系统调用来执行特定任务(例如读取文件、写入输出或简单的退出...)。我知道一些系统调用,因为我读过它们在互联网上的一些示例(例如 eax=0, ebx=1 int 0x80 exit with return value of 1),但仅此而已......我怎么知道是否还有其他退出系统调用的参数?或者另一个系统调用?我正在寻找一个文档来解释哪些系统调用有哪些参数要传递到哪些寄存器中。
我已经阅读了有关退出函数等的手册页,但它没有向我解释我要问的内容。
希望我说得足够清楚,
谢谢你!
The x86wiki(我刚刚再次更新:)有指向系统调用 ABI 的链接(每个调用的数字是什么,参数放在哪里,要运行什么指令,以及返回时哪些寄存器将被破坏)。这没有记录在手册页中,因为它是特定于体系结构的。二进制常量也是如此:它们不必在每个体系结构上都相同。
grep -r O_APPEND /usr/include
让您的目标架构递归搜索.h
files.
更好的是进行设置,以便您可以在汇编源代码中使用符号常量,以提高可读性并避免错误风险。
gcc在处理时实际上确实使用了C预处理器.S
文件,但包括大多数 C 头文件也将为您提供一些 C 原型。
或者转换#define
s 到 NASM 宏sed
或者其他的东西。或许可以喂一些#include<>
行发送到 C 预处理器并让它仅打印出宏定义。
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
进入 NASMsymbol equ value
。生成的文件有很多行error: expression syntax error
当我尝试在其上运行 NASM 时,但手动从中选择一些有效的行可能会起作用。
一些常量是在多个步骤中定义的,例如#define S_IRGRP (S_IRUSR >> 3)
。转换为 NASM 时这可能有效,也可能无效equ
符号定义。
另请注意,在 C 中0666
, 是一个八进制常数。在 NASM 中,您需要0o666
or 666o
;前导 0 并不特殊。否则,十六进制和十进制常量的 NASM 语法与 C 兼容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)