Search code examples
solarissystem-callscalling-convention

What is an OpenSolaris syscall calling convention (x86)?


What is an OpenSolaris syscall calling convention (x86)?

F.e. I'd like to write a program in 32bit assembly which displays a string to the console. For this I'd like to use "write" syscall (no. 4). C definition for write is:

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

what registers should hold fildes, buf and nbyte arguments? Which interrupt should I call?


Solution

  • You could write a C program which calls write,compile it to assembly language (use -S option). And then examine the output to see how the compiler does it.

    Edit:

    OpenSolaris libc does it like this:

    First when you call write it check some things and then calls __write:

    pushl  0x10(%ebp)
    pushl  0xc(%ebp)
    pushl  0x8(%ebp)
    call   c2730 <__write>
    

    and __write then looks like:

    <__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
    

    It puts the write syscall number in eax (4), stack pointer in ecx and the return address in edx. And the arguments to the write syscall have been already pushed on the stack.