rdx 传递第三个参数或者第二个返回值 rax 临时寄存器或者第一个返回值 分别使用通用寄存器edi、esi、edx保存了三个参数a、b、c,eax会保存函数的返回值,所以需要置零。后续就可以调用func1了。 函数调用的栈 首先看下func1的汇编代码: func1: pushq %rbp movq %rsp, %rbp movl %edi, -4(%rbp) movl %es...
## 关于64位汇编的参数传递 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。参数个数大于 7 个的时候 ``` H(a, b, c, d,
X86-64 体系结构上 C语言的函数参数的传递 函数参数的传递用的是通用寄存器或堆栈,是可以由编译器来决定的,不过一般都会遵守特定规则,以GCC为例,看一下其在X86和X64上是什么情况 测试代码: inttest6(intp1,intp2,intp3,intp4,intp5,intp6) {returnp1+p2+p3+p4+p5+p6; }inttest7(intp1,intp2,intp3,...
8 movq %rcx, -32(%rbp) -- 第4个参数,存入 9 movq %r8, -40(%rbp) -- 第5个参数,存入 10 movq %r9, -48(%rbp) -- 第6个参数,存入,前面6个参数都是通过寄存器传递的 -- 下面开始为调用foo准备参数 11 movq -48(%rbp), %r9 -- 准备第6个参数,入%r9 12 movq -40(%rbp), %r8 --...
通过寄存器,过程 P 可以传递最多 6 个整数值(包括指针和整数),如果 Q 需要更过参数时,P 可以在调用 Q 之前在自己的栈帧里存储好这些参数。 2.5.2 过程调用惯例 2.5.2.1 参数传递 x86-64中,最多允许 6 个参数通过寄存器来传递,多出的参数需要通过栈来传递,正如 2.5.1 节描述的那样;传递参数时,参数的...
现在寄存器不够用了,就将i,j两个参数保存到栈中。 栈的开头保存了函数的返回地址; 在x86_64架构中,整数和指针等的大小就是giant word。g:giant word (gdb)x/3g $rsp 和x/3g $sp一样的 0x7fffffffe388:<-栈内容:返回地址:main中的func()的下一条命令的地址 4195740 6293952<-剩余的参数i,v1的指针 ...
所以我们现在知道, 在 x86_64/linux/gcc3.2 中, 即使不打开优化选项, 函数的参数也会通过寄存器来传递, 这肯定是阔了的表现(通用寄存器多了). 我试验了多个参数的情况,发现一般规则为, 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。当参数为 7 个以上时, 前 6 个与前面...
突然好奇x86架构下函数参数怎么传递的,之前只是听别人说过通过寄存器,但是怎么传,什么顺序都没有仔细研究过,也没有实际测试过,因此就想着用实践来检验一下咯。 传参顺序 在32位和64位机器上,寄存器名称不同,64位机器为rxx,32位机器为exx。传参顺序如下, ...
1. X86下的参数传递 参数传递: (1)32位程序使用栈传递。 (2)64位程序根据参数的个数而不同, 当参数1~6个,使用寄存器传递;参数大于6个,多出来的参数使用栈传递。 2. ARM下的参数传递 AAPCS标准简介 AAPCS(ARM Architecture Procedure Call Standard): ARM架构过程调用标准。它规定了一些子程序间调用的基本规则...
参数传递 X86时代,参数传递是通过入栈实现的,相对CPU来说,存储器访问太慢;这样函数调用的效率就不高,在x86-64时代,寄存器数量多了,GCC就可以利用多达6个寄存器来存储参数,多于6个的参数,依然还是通过入栈实现。了解这些对我们写代码很有帮助,起码有两点启示: 尽量使用6个以下的参数列表,不要让GCC为难啊。 传递...