为什么在递归过程中使用push指令而不是覆盖内存位置%esp点会导致不明确的行为



我有以下组件:

recursive:
pushl   %ebp
movl    %esp, %ebp
subl    $40, %esp
cmpl    $0, 8(%ebp)
jne .L6
movl    $0, %eax
jmp .L7
.L6:
movl    8(%ebp), %eax
movl    (%eax), %eax
movl    %eax, -12(%ebp)
movl    8(%ebp), %eax
movl    4(%eax), %eax
movl    %eax, (%esp)
call    recursive
movl    %eax, -16(%ebp)
movl    -16(%ebp), %eax
movl    -12(%ebp), %edx
leal    (%edx,%eax), %eax
.L7:
leave
ret

当我尝试push %eax而不是将其移动到esp所指向的内存地址时,我的程序不能正常工作。我认为它与堆栈大小有关,堆栈大小是40,因为当我把它设为36时,它可以很好地处理push指令。然而,我不明白为什么这很重要,因为我在汇编中使用的所有内存地址都是相对于esp和ebp的。

要么是其他地方有bug,要么是堆栈不够大,无法处理递归。

最新更新