gpt4 book ai didi

assembly - 为什么BSD系统在执行系统调用时需要sub esp,4?

转载 作者:行者123 更新时间:2023-12-02 19:16:46 25 4
gpt4 key购买 nike

我正在 OS X(32 位)上执行系统调用,如下所示:

push 123
mov eax, 1
sub esp, 4
int 0x80

而且我不太明白 sub esp, 4 间隙。

我在某处读到,BSD 及其衍生产品总是存在这种差距,但找不到原因的解释。

我的第一个想法是堆栈对齐,但事实并非如此,因为该行随处可见,而且据我所知,OS X 需要 16 字节堆栈对齐(这里也不是这种情况) 。

您知道执行 sub esp, 4 的必要性背后隐藏着什么吗?或者可以向我指出正确描述它的资源吗?

最佳答案

(社区维基,因为我只是总结评论)

BSD 这样做是为了使系统调用的 libc 包装函数更加高效,因为它们可以只执行 int 0x80 而无需复制参数。它为 CALL 推送到包装函数的返回地址留出了空间。

在 Unix/Linux 系统中,像 read(2) 这样的系统调用实际上是围绕内核调用的库包装函数,而不是扩展为 inline-asm 的宏,这是标准。

<小时/>

Linux 以不同的方式解决了这个问题:通过在寄存器中传递所有系统调用参数。我猜这意味着 32 位包装器函数必须从堆栈加载所有参数,但至少它们不必由内核存储和重新读取。

x86-64 系统调用 ABI 与函数调用约定更加兼容:只需要一个 mov r10, rcx,因为 System V 函数调用约定在寄存器中传递参数(并且系统调用寄存器被选择为尽可能匹配,除了 the SYSCALL instruction itself destroys RCX and R11, so the kernel can't see the original values 。)

请参阅 tag wiki 了解有关调用约定实际是什么的更多信息,以及 ABI 的链接。

关于assembly - 为什么BSD系统在执行系统调用时需要sub esp,4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com