%rdi 【参数】六个寄存器用于存储函数调用时的6个参数 %rsi 【参数】六个寄存器用于存储函数调用时的6个参数 %rdx 【参数】六个寄存器用于存储函数调用时的6个参数 %rcx 【参数】六个寄存器用于存储函数调用时的6个参数 %r8 【参数】六个寄存器用于存储函数调用时的6个参数 %r9 【参数】六个寄存器用于...
把caller 的栈顶的内存地址(存在 rsp 寄存器中)赋值到 rbp 寄存器。 sub$0x20,%rsp 把rsp再减去0x20,也就是地址再向下移动32个单元(字节),用于main函数局部变量和参数的存储。这里预留少空间,在编译期就计算好了。当前实验是10个参数,如果我们改为13个参数,则会是sub $0x50,%rsp,所以生成的汇编代码,在运行...
## 关于64位汇编的参数传递 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。参数个数大于 7 个的时候 ``` H(a, b, c, d,
x86-64 中,有 6 个寄存器来存储参数,如前面第二个表所示,依次为%rdi、%rsi、%rdx、%rcx、%r8、%r9,如下表所示,如果多于 6 个参数,依然还是通过入栈实现,如上面的图4图5中的param部分所示,所以从性能的角度上来看,我们设计的函数参数最好不超过六个,这样参数就都会直接通过寄存器传递,而不用通过栈传递。
%rdi, %rsi, %rdx, %rcx,%r8, %r9 :六个寄存器,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9;当参数为7个以上时,前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。 ; 参数>=7时 ...
%rsp 栈指针寄存器,指向栈顶 %rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数。。。 %rbx,%rbp,%r12,%r13,%14,%15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改 %r10,%r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前...
64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e开头,而64位前8个使用了r代替e。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。 32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rd...
参考答案:X86-64过程调用时参数传递是通过通用寄存器进行的,前三个参数所用寄存器顺序为RDI、RSI、RDX。abc的4种合理的函数原型为:1viod abc(int
intadd(inta,intb,intc,intd,inte,intf,intg,inth){// 8 个参数intsum = a + b + c + d + e + f + g + h;//相加求和returnsum;}intmain(void){inti =10;intj =20;intk = i + j;intsum =add(11,22,33,44,55,66,77,88);intm = k;// 为了观察 %rax Caller Save 寄存器的恢...
进入x64时代,寄存器资源富裕了,参数传递绝大多数都是用寄存器来传了。寄存器传参的好处是速度快,减少了对内存的读写次数。 当然,具体使用栈还是用寄存器传参数,这个不是编程语言决定的,而是编译器在编译生成CPU指令时决定的,如果编译器非要在x64架构CPU上使用线程栈来传参那也不是不行,这个对高级语言是无感知的...