gpt4 book ai didi

assembly - 在函数中使用哪些寄存器是安全的 (x86)

转载 作者:行者123 更新时间:2023-12-04 07:55:51 25 4
gpt4 key购买 nike

根据 Wikipedia英特尔 ABI 允许使用 EAX , ECXEDX而不将它们保留在函数中。
我不确定“英特尔 ABI”是什么意思。这是否意味着所有针对 Intel CPU 的编译器都强制执行/遵循它?我正在编写一个将从 C 代码调用的汇编函数。我可以为所有编译器假设这个吗? (我目前只针对 x86)

最佳答案

Intel ABI 只是 Intel 建立的调用约定。

通常,在函数调用期间如何传递参数以及保存或删除哪些寄存器是由函数的调用约定定义的:

http://en.wikipedia.org/wiki/Calling_convention

特别是对于 __cdecl、__stdcall 和 __fastcall,您应该期望 EAX、ECX 和 EDX 被丢弃,并且您的函数应该保留其他寄存器并在 EAX 上返回(或 EDX:EAX 用于 64 位返回)。

如果您不知道应该使用的调用约定是什么,则不应使用汇编语言编写,因为弄乱调用约定可能会导致应用程序中出现可利用的错误。

在 C 中,默认调用约定通常是 __cdecl,对于 Windows 导出的 API,它通常是 __stdcall。

关于assembly - 在函数中使用哪些寄存器是安全的 (x86),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14701563/

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