-3

我试图在递归函数调用期间理解汇编代码。

#include<stdio.h>
int recursive(int no){
  if(no > 1){
    no--;
    recursive(no);
    printf("\n %d \n",no);
  }
  else if(no == 1){
    return 1;
  }
}

int main(){
  int a = 10;
  recursive(a);
  return 0;
}

拆卸:

   .file   "sample2.c"
        .section        .rodata
.LC0:
        .string "\n %d \n"
        .text
.globl recursive
        .type   recursive, @function
recursive:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        cmpl    $1, 8(%ebp)
        jle     .L2
        subl    $1, 8(%ebp)
        movl    8(%ebp), %eax
        movl    %eax, (%esp)
        call    recursive
        movl    $.LC0, %eax
        movl    8(%ebp), %edx
        movl    %edx, 4(%esp)
        movl    %eax, (%esp)
        call    printf
        jmp     .L5
.L2:
        cmpl    $1, 8(%ebp)
        jne     .L5
        movl    $1, %eax
        movl    %eax, %edx
        movl    %edx, %eax
        jmp     .L4
.L5:
.L4:
        leave
        ret
        .size   recursive, .-recursive
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $32, %esp
        movl    $10, 28(%esp)
        movl    28(%esp), %eax
        movl    %eax, (%esp)
        call    recursive
        movl    $0, %eax
        leave
        ret
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
        .section        .note.GNU-stack,"",@progbits

我可以理解 .LC0 始终包含字符串文字。但我不知道它的真正含义。想了解在函数调用过程中进行递归的代码。我无法理解这段汇编代码的作用,

        subl    $24, %esp
        cmpl    $1, 8(%ebp)
        jle     .L2
        subl    $1, 8(%ebp)
        movl    8(%ebp), %eax
        movl    %eax, (%esp)
        call    recursive
        movl    $.LC0, %eax
        movl    8(%ebp), %edx
        movl    %edx, 4(%esp)
        movl    %eax, (%esp)
        call    printf
        jmp     .L5
.L2:
        cmpl    $1, 8(%ebp)
        jne     .L5
        movl    $1, %eax
        movl    %eax, %edx
        movl    %edx, %eax
        jmp     .L4

Q1:递归函数包含 1 个参数。所以在填充对齐之后,它必须是8。为什么它是24。

同样在 .L2 中,

        movl    $1, %eax
        movl    %eax, %edx
        movl    %edx, %eax
        jmp     .L4

Q2:我们已经将“1”移动到累加器,为什么我们再次移动到数据寄存器然后又回到累加器。

Q3:我们是否从堆栈中弹出。如果 leave 用于弹出堆栈,我们不是弹出其余 8 个堆栈帧吗?

4

1 回答 1

1

要回答您帖子中唯一与您的标题相匹配的内容:

为什么我们不从堆栈中弹出而只在程序集中推送指令。

因为leave相当于:

movl %ebp, %esp
popl %ebp
于 2013-04-03T00:00:45.737 回答