您的位置:首页 > 编程语言

递归调用的汇编代码分析

2010-10-14 16:37 155 查看
今天重读《深入理解计算机系统》中关于递归的章节,发现书中的反汇编代码和自己本机的不同,

区别在于书中的递归汇编代码中有多处push操作,而本机的汇编代码中没有。

C代码如下:

int fib_rec(int n)
{
int prev_val, val;

if(n < 2)
return 1;

prev_val = fib_rec(n - 2);
val = fib_rec(n - 1);

return prev_val + val;
}


本机汇编代码如下:

fib_rec:
pushl   %ebp
movl    %esp, %ebp
subl    $24, %esp
cmpl    $1, 8(%ebp)
jg      .L2
movl    $1, -20(%ebp)
jmp     .L3
.L2:
movl    8(%ebp), %eax
subl    $2, %eax
movl    %eax, (%esp)
call    fib_rec
movl    %eax, -8(%ebp)
movl    8(%ebp), %eax
subl    $1, %eax
movl    %eax, (%esp)
call    fib_rec
movl    %eax, -4(%ebp)
movl    -4(%ebp), %edx
movl    -8(%ebp), %eax
addl    %edx, %eax
movl    %eax, -20(%ebp)
.L3:
movl    -20(%ebp), %eax
leave
ret


书上的汇编代码:

fib_rec:
pushl %ebp
movl %esp,%ebp
subl $16,%esp
pushl %esi
pushl %ebx
movl 8(%ebp),%ebx
cmpl $2,%ebx
jle .L24
addl $-12,%esp
leal -2(%ebx),%eax
pushl %eax
call fib_rec
movl %eax,%esi
addl $-12,%esp
leal -1(%ebx),%eax
pushl %eax
call fib_rec
addl %esi,%eax
jmp .L25
.L24:
movl $1,%eax
.L25:
leal -24(%ebp),%esp
popl %ebx
popl %esi
movl %ebp,%esp
popl %ebp
ret


movl %eax, (%esp) 是将%eax(参数n)放入栈顶,完成了参数压栈的操作。

与书中的汇编代码相比,

1、使用的寄存器数量少了;

2、指令数量少了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐