什么是OpenSolaris系统调用约定(x86)?
F.e。我想用32位程序集编写一个程序,它向控制台显示一个字符串。为此,我想使用“写”系统调用(编号4)。写的C定义是:
ssize_t write(int fildes, const void *buf, size_t nbyte)
哪些寄存器应该包含 fildes , buf 和 nbyte 参数?我应该打电话给哪个中断?
答案 0 :(得分:2)
您可以编写一个调用write
的C程序,将其编译为汇编语言(使用-S
选项)。然后检查输出以查看编译器是如何做到的。
修改强>
OpenSolaris libc是这样的:
首先,当你打电话给它时,检查一些东西,然后调用__write:
pushl 0x10(%ebp)
pushl 0xc(%ebp)
pushl 0x8(%ebp)
call c2730 <__write>
然后和__write看起来像:
<__write>:
call c2735 <__write+0x5>
pop %edx
mov $0x4,%eax
mov %esp,%ecx
add $0x10,%edx
sysenter
jae c2751 <__write+0x21>
cmp $0x5b,%eax
je c2730 <__write>
jmp 2e0d0 <__cerror>
ret
它将写入系统调用号放在eax(4)中,堆栈指针放在ecx中,返回地址放在edx中。而且写入系统调用的参数已经被压入堆栈。