我有一段汇编代码通过
执行write system call(这是正确的吗?)call write@plt
在此之前,设置/修改rax
,地址rsp
,edi
,rsi
和rdx
的值。
我如何知道哪些寄存器通常用作写或系统函数调用的参数?
我的猜测是写rsp
,edi
和rsi
,因为在C
中需要3个参数:
ssize_t write(int fd, const void *buf, size_t nbytes);
答案 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 libraries为free software,一般为GNU glibc或musl-libc等等......请仔细研究其源代码,以便了解{{1}已实施。