关于x86_64函数调用的一个问题?

发布于 2022-09-04 18:21:27 字数 2098 浏览 9 评论 0

例如:


int add(int a, int b) {
    int result;

    result = a + b;

    return result;
}

int main(int argc, char *argv[]) {
    int a,b,result;

    a = 1;
    b = 2;
    result = add(a,b);

    return 0;
}
00000000004004d6 <add>:
  4004d6:    55                       push   %rbp
  4004d7:    48 89 e5                 mov    %rsp,%rbp
  4004da:    89 7d ec                 mov    %edi,-0x14(%rbp)
  4004dd:    89 75 e8                 mov    %esi,-0x18(%rbp)
  4004e0:    8b 55 ec                 mov    -0x14(%rbp),%edx
  4004e3:    8b 45 e8                 mov    -0x18(%rbp),%eax
  4004e6:    01 d0                    add    %edx,%eax
  4004e8:    89 45 fc                 mov    %eax,-0x4(%rbp)
  4004eb:    8b 45 fc                 mov    -0x4(%rbp),%eax
  4004ee:    5d                       pop    %rbp
  4004ef:    c3                       retq   

00000000004004f0 <main>:
  4004f0:    55                       push   %rbp
  4004f1:    48 89 e5                 mov    %rsp,%rbp
  4004f4:    48 83 ec 20              sub    $0x20,%rsp
  4004f8:    89 7d ec                 mov    %edi,-0x14(%rbp)
  4004fb:    48 89 75 e0              mov    %rsi,-0x20(%rbp)
  4004ff:    c7 45 f4 01 00 00 00     movl   $0x1,-0xc(%rbp)
  400506:    c7 45 f8 02 00 00 00     movl   $0x2,-0x8(%rbp)
  40050d:    8b 55 f8                 mov    -0x8(%rbp),%edx
  400510:    8b 45 f4                 mov    -0xc(%rbp),%eax
  400513:    89 d6                    mov    %edx,%esi
  400515:    89 c7                    mov    %eax,%edi
  400517:    e8 ba ff ff ff           callq  4004d6 <add>
  40051c:    89 45 fc                 mov    %eax,-0x4(%rbp)
  40051f:    b8 00 00 00 00           mov    $0x0,%eax
  400524:    c9                       leaveq 
  400525:    c3                       retq   
  400526:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
  40052d:    00 00 00 

这里main中,标准起手之后,为什么不直接使用寄存器赋值,而是要先保存edi和rsi的值?

%edi,-0x14(%rbp)
%rsi,-0x20(%rbp)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文