x64 汇编 参数传递

x64 汇编 参数传递,第1张

x64 汇编 参数传递

参数传递在不同的系统上是不一样的
称作 calling convention

windows

rcx,rdx,r8,r9 用来存储整数或指针参数,按照从左到右的顺序
xmm0,1,2,3 用来存储浮点参数
其余参数会压入栈中。

linux

当参数在 6 个以内,参数从左到右依次放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数大于 6 个, 大于六个的部分的依次从 “右向左” 压入栈中,和32位汇编一样。

参数个数大于 6 个的时候

H(a, b, c, d, e, f, g, h);
a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%r8, f->%r9
h->8(%esp)
g->(%esp)
call H

1、x86_64 registers

2、x86_64寄存器特性表

3、特性要点:
  1)常用寄存器有16个,分为 x86 通用寄存器以及 r8-r15 寄存器。
  2)通用寄存器中,函数执行前后必须保持原始的寄存器有3个:是rbx、rbp、rsp。rx寄存器中,最后 4 个必须保持原值:r12、r13、r14、r15。
保持原值的意义是为了让当前函数有可信任的寄存器,减小在函数调用过程中的保存&恢复 *** 作。除了 rbp、rsp 用于特定用途外,其余5个寄存器可随意使用。
  3)通用寄存器中,不必假设保存值可随意使用的寄存器有5个:是rax、rcx、rdx、rdi、rsi。其中rax用于第一个返回寄存器(当 然也可以用于其它用途),rdx用于第二个返回寄存器(在调用函数时也用于第三个参数寄存器)。rcx用于第四个参数。rdi用于第一个参数。rsi用于 第二个函数参数。
  4)r8、r9分配用于第5、第6个参数。

参考
  1. https://www.cnblogs.com/volva/p/11814998.html
  2. https://www.intel.com/content/dam/develop/external/us/en/documents/introduction-to-x64-assembly-181178.pdf
  3. https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf
  4. https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170
  5. https://aaronbloomfield.github.io/pdr/book/x86-64bit-ccc-chapter.pdf
  6. https://cs61.seas.harvard.edu/site/2018/Asm2/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5698825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存