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