【问题标题】:What is an OpenSolaris syscall calling convention (x86)?什么是 OpenSolaris 系统调用调用约定 (x86)?
【发布时间】:2013-05-05 12:08:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: solaris system-calls calling-convention


    【解决方案1】:

    您可以编写一个调用write 的C 程序,将其编译为汇编语言(使用-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 系统调用的参数已经被压入堆栈。

    【讨论】:

    • 编译器从 libc 调用'write'函数。当我使用“系统调用”函数调用系统调用时也是如此——它从 libc 调用“系统调用”函数。有空我会分析一下libc对这些函数的实现,不过那个时候还没到:)
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2020-05-24
    • 2018-06-07
    • 2021-05-11
    • 2018-01-26
    相关资源
    最近更新 更多