2014-01-17 45 views
1

例如,我想打电话给void exit(int exit_code)为什么你必须在OSX上打系统调用?

main: 
    push 42 ; Push the return value 
    push 0  ; Pad the value before calling the interrupt 
    mov eax, 1 ; exit syscall 
    int 80h ; invoke 
    ret 

为什么我需要垫此参数正常工作?

+1

OSX保持对齐到16字节边界的堆栈,据我所知......我怀疑这就是原因。 –

+0

啊,这表明我正确的方向,谢谢! – sircodesalot

回答

4

似乎额外的推送是从BSD系统调用约定继承。

其中,int 80h指令最初位于单独的函数中,该函数在推送系统调用参数后被调用。这意味着有一个额外的,由call指令引起的隐式推送和系统调用处理程序的预期并跳过它。既然你不使用包装器,你必须推入另一个填充值。

http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html

相关问题