写系统调用参数寄存器

时间:2015-06-13 15:36:12

标签: c linux assembly x86

我有一段汇编代码通过

执行write system call(这是正确的吗?)
call write@plt

在此之前,设置/修改rax,地址rspedirsirdx的值。

我如何知道哪些寄存器通常用作写或系统函数调用的参数?

我的猜测是写rspedirsi,因为在C中需要3个参数:

ssize_t write(int fd, const void *buf, size_t nbytes);

1 个答案:

答案 0 :(得分:2)

当你call write@plt时, 直接调用write(2)系统调用,而是一个微小的包装器(一个微小的C函数,它执行系统调用并设置{失败时{1}}。

因此,此errno函数使用calling convention(应用程序二进制接口)中定义的标准C ABI。对于Linux x86-64,请阅读SysV ABI interface for x86-64

另请阅读vdso(7)以了解更多关于如何实际完成某些系统调用的信息。其他人可能会使用write机器指令等... ABI规范中给出了一些细节(严格意义上讲,真正的syscall没有使用任何堆栈并且通过寄存器传递参数和结果)。另请阅读Linux Assembly HowTo(更侧重于32位x86)。

此外,Linux的C standard librariesfree software,一般为GNU glibcmusl-libc等等......请仔细研究其源代码,以便了解{{1}已实施。