【问题标题】:How are parameters accepted by standard c functions in assembly? [duplicate]汇编中的标准 c 函数如何接受参数? [复制]
【发布时间】:2019-04-26 13:39:03
【问题描述】:

我有 64 位 MacOS 汇编代码,它对数组执行二进制搜索。标准 C 库中的二进制搜索是:

void* bsearch (const void* key, const void* base,
               size_t num, size_t size,
               int (*compar)(const void*,const void*));

我的程序集看起来像

mov    %edi,0x2(%rsp)
mov    $0x2010,%r8d
mov    $0x4,%ecx
lea    0x2(%rsp),%rdi
callq  <bsearch@plt>

我想知道bsearch 采用的参数是否有任何确定的顺序,即有没有办法知道rdi, ecx, r8d 在这里对应的是什么?是keybasecompar吗?

【问题讨论】:

  • 这取决于您所在平台的调用约定。例如,64 位 Windows 的调用约定不同于 64 位 Linux(或 OSX)代码。查看您提供的代码,我可以推断您并非针对 Windows,而且您似乎正在使用使用 AMD64 System V ABI 的系统。您可以找到调用约定的摘要和使用的寄存器here。完整的副本可以找到here
  • 谢谢。我正在使用 OSX。
  • 是的,OSX 使用 AMD64 System V ABI,所以我提供的链接应该适用。
  • 链接副本涵盖了正常的函数调用约定以及系统调用调用约定。

标签: c assembly x86-64


【解决方案1】:

有两种可能的调用约定,具体取决于您的操作系统(有关详细信息,请参阅here)。在 Microsoft 上,顺序是 RCX、RDX、R8、R9。在 Unix 上,顺序是 RDI、RSI、RDX、RCX、R8、R9。请注意,开头的“r”或“e”仅表示您是使用寄存器的全部 64 位 (r) 还是仅使用低 32 位 (e)。所以在你的情况下,我猜你使用的是 Unix,对应关系是 rdi=key, ecx=size, r8d=compar。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2015-02-16
    • 2012-09-08
    相关资源
    最近更新 更多