我有以下组件:
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,要么是堆栈不够大,无法处理递归。