代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

WinAPI函数中哪些CPU寄存器可能会更改[[副本]

  •  0
  • René Nyffenegger  · 技术社区  · 6 年前

    Wikipedia Intel ABI允许使用 EAX , ECX EDX
    我不知道“英特尔ABI”是什么意思。这是否意味着所有以英特尔CPU为目标的编译器都会强制执行/遵循它?我正在编写一个汇编函数,它将从C代码中调用。我能假设所有的编译器都是这样吗(我只是针对 x86 (目前)

    0 回复  |  直到 12 年前
        1
  •  6
  •   SecurityMatt Davide Berra    12 年前

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

    通常,在函数调用期间,参数的传递方式以及保存或丢弃的寄存器由函数的调用约定定义:

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

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

    在C中,默认的调用约定通常是\uu cdecl,对于Windows导出的API,它通常是\uu stdcall。

        2
  •  1
  •   paxdiablo    12 年前

    它是英特尔应用程序二进制接口,是一组规则,指示哪些寄存器可以在不保存的情况下使用,参数如何被推送到堆栈上,调用者或被调用者是否清除堆栈帧等等。

    如果你 知道

    但这并不一定适用于所有编译器,除非编译器特别声明,否则这样想是不明智的。