二进制-linux 64位x86_64程序调用栈的结构


x86_64有16个64位寄存器,分别是:

%rax,%rbx,%rcx,%rdx,%esi,%edi,%rbp,%rsp,%r8,%r9,%r10,%r11,%r12,%r13,%r14,%r15。

其中:

%rax 作为函数返回值使用。
%rsp 指针寄存器,指向栈顶
%rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数
%rbx,%rbp,%r12,%r13,%14,%15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改
%r10,%r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值

64位与32位的不同在于64位不用压栈来存储下一个函数参数,而是放在了%rdi,%rsi,%rdx,%rcx,%r8,%r9六个寄存器中,超出部分再压栈。

声明:物博网|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 二进制-linux 64位x86_64程序调用栈的结构


喜欢安全与WEB开发