- 论坛徽章:
- 2
|
本帖最后由 neodreamerus 于 2015-01-08 22:20 编辑
回复 2# zsszss0000
你说的第一点我也理解。但是我问的问题的意思是:类似你举得例子这种简单情况太少了,大部分函数会调用其他函数。用寄存器传参会有一些好处,但是感觉很多时候这种优势并不明显。
第二点嘛,自己写个简单的程序编译一下就知道了。x86-64下函数的前4个参数都是寄存器传参的。我写的程序里,在call指令之前参数放到edi,
然后call。然后在factorial函数内部由于edi要被用于另外的函数calling,所以edi的值又被压入栈中。
- #include <stdio.h>
- int factorial(int n) {
- if ( n == 1 ) return 1;
- return n*factorial(n-1);
- }
- int main(int argc, char* argv[]) {
- printf("%d\n", factorial(4));
- }
复制代码 编译成
- .file "a.c"
- .text
- .globl factorial
- .type factorial, @function
- factorial:
- .LFB0:
- pushq %rbp
- movq %rsp, %rbp
- subq $16, %rsp
- movl %edi, -4(%rbp)
- cmpl $1, -4(%rbp)
- jne .L2
- movl $1, %eax
- jmp .L3
- .L2:
- movl -4(%rbp), %eax
- subl $1, %eax
- movl %eax, %edi
- call factorial
- imull -4(%rbp), %eax
- .L3:
- leave
- ret
- .LFE0:
- .size factorial, .-factorial
- .section .rodata
- .LC0:
- .string "%d\n"
- .text
- .globl main
- .type main, @function
- main:
- pushq %rbp
- movq %rsp, %rbp
- subq $16, %rsp
- movl %edi, -4(%rbp)
- movq %rsi, -16(%rbp)
- movl $4, %edi
- call factorial
- movl %eax, %esi
- movl $.LC0, %edi
- movl $0, %eax
- call printf
- leave
- ret
复制代码 |
|