什么是OpenSolaris系统调用约定(x86)?

时间:2010-08-04 06:03:13

标签: solaris system-calls calling-convention

什么是OpenSolaris系统调用约定(x86)?

F.e。我想用32位程序集编写一个程序,它向控制台显示一个字符串。为此,我想使用“写”系统调用(编号4)。写的C定义是:

ssize_t write(int fildes, const void *buf, size_t nbyte)

哪些寄存器应该包含 fildes buf nbyte 参数?我应该打电话给哪个中断?

1 个答案:

答案 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中。而且写入系统调用的参数已经被压入堆栈。