1

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

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

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

哪些寄存器应该保存fildesbufnbyte参数?我应该调用哪个中断?

4

1 回答 1

2

您可以编写一个调用 C 程序,将其write编译为汇编语言(使用-S选项)。然后检查输出,看看编译器是如何做到的。

编辑:

OpenSolaris libc 是这样做的:

首先,当您调用 write 时,它​​会检查一些内容,然后调用 __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 中。并且 write 系统调用的参数已经被压入堆栈。

于 2010-08-04T07:41:06.740 回答