例如,我想致电void exit(int exit_code)
:
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
为什么我需要填充参数以使其正常工作?
答案 0 :(得分:4)
似乎额外推送是从BSD系统调用约定继承的。
其中,int 80h
指令最初位于单独的函数中,该函数在推送syscall参数后调用。这意味着由call
指令引起的额外的隐式推送和预期的syscall处理程序并跳过它。由于您不使用包装器,因此必须推送另一个填充值。
http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html