首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >amd64中传递的参数如何?

amd64中传递的参数如何?
EN

Stack Overflow用户
提问于 2014-05-05 16:18:09
回答 2查看 635关注 0票数 2

我想知道在amd64上调用C中的libc函数时如何传递参数。

例如,如果我调用sqrt(double),参数是由堆栈传递还是由寄存器传递?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-12 08:14:53

让我们编写一个示例usecase (test.c):

代码语言:javascript
复制
#include <math.h>

int main()
{
    double val = sqrt(foo(8));
    return 0;
}

double foo(double val)
{
    val+=1;
    return val;
}

汇编:

代码语言:javascript
复制
gcc test.c -lm

然后检查导入的符号:

代码语言:javascript
复制
readelf -Wa a.out |grep sqrt

    4: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sqrt@GLIBC_2.2.5 (3)
   63: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sqrt@@GLIBC_2.2.5

拆卸物体:

代码语言:javascript
复制
objdump -d a.out

0000000000400582 <main>:
  400582:       55                      push   %rbp
  400583:       48 89 e5                mov    %rsp,%rbp
  400586:       48 83 ec 10             sub    $0x10,%rsp
  40058a:       f2 0f 10 05 26 01 00    movsd  0x126(%rip),%xmm0
  400591:       00 
  400592:       e8 bd ff ff ff          callq  400554 <foo>
  400597:       66 0f 28 c8             movapd %xmm0,%xmm1
  40059b:       f2 0f 51 c1             sqrtsd %xmm1,%xmm0
  40059f:       66 0f 2e c0             ucomisd %xmm0,%xmm0
  4005a3:       7a 06                   jp     4005ab <main+0x29>
  4005a5:       66 0f 2e c0             ucomisd %xmm0,%xmm0
  4005a9:       74 09                   je     4005b4 <main+0x32>
  4005ab:       66 0f 28 c1             movapd %xmm1,%xmm0
  4005af:       e8 ac fe ff ff          callq  400460 <sqrt@plt>
  4005b4:       f2 0f 11 45 f8          movsd  %xmm0,-0x8(%rbp)
  4005b9:       b8 00 00 00 00          mov    $0x0,%eax
  4005be:       c9                      leaveq 
  4005bf:       c3                      retq

所以您可以看到sqrt的参数是通过%xmm0寄存器传递的。

票数 1
EN

Stack Overflow用户

发布于 2015-09-12 21:21:27

我最近创建了工具来可视化函数的堆栈框架、注册使用、结构化类型的内存布局和其他ABI信息。您可以查看libssh库函数ssh_channel_read_timeout on x86_64 这里的结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23477118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档