什么是 OpenSolaris 系统调用调用约定 (x86)?
我想用 32 位程序集编写一个程序,向控制台显示一个字符串。为此,我想使用“写”系统调用(第 4 号)。写的 C 定义是:
ssize_t write(int fildes, const void *buf, size_t nbyte)
哪些寄存器应该保存fildes、buf和nbyte参数?我应该调用哪个中断?
什么是 OpenSolaris 系统调用调用约定 (x86)?
我想用 32 位程序集编写一个程序,向控制台显示一个字符串。为此,我想使用“写”系统调用(第 4 号)。写的 C 定义是:
ssize_t write(int fildes, const void *buf, size_t nbyte)
哪些寄存器应该保存fildes、buf和nbyte参数?我应该调用哪个中断?
您可以编写一个调用 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 系统调用的参数已经被压入堆栈。