Assembly 为什么使用push指令而不是覆盖内存位置%esp点会在递归过程中导致不明确的行为
我有以下组件:Assembly 为什么使用push指令而不是覆盖内存位置%esp点会在递归过程中导致不明确的行为,assembly,x86,Assembly,X86,我有以下组件: 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
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
当我尝试推送%eax而不是将其移动到esp指向的mem地址时,我的程序无法正常工作。我认为这与堆栈大小有关,堆栈大小为40,因为当我将其设为36时,它与push指令配合使用效果良好。但是,我不明白为什么这很重要,因为我在汇编中使用的所有内存地址都是相对于esp和ebp的。或者您在其他地方有错误,或者您的堆栈不够大,无法处理递归。我认为呈现的代码没有问题。呈现的代码还可以,但当我编写“push%eax”而不是movl%eax、(%esp)时,它无法正常工作。我确信没有错误,但可能堆栈大小不能像你说的那样处理递归,但我不明白为什么它不够大,不能处理递归,我没有很多变量,和帧指针的最大偏移量只是16@bfaskiplar:我不知道为什么
pushl%eax
而不是movl%eax,(%esp)
使程序失败。不应该。我尝试了同样的(*)程序,两种方法都对我很有效。(*)相同=转换为英特尔语法和16位。它只是工作。我猜。调用recursive
时,您可能会覆盖堆栈上的某些数据,并且根据recursive
使用堆栈的方式,覆盖数据的方式会有所不同。查找所有可能在堆栈上创建/保留数据并将其地址返回给调用方的例程。这是一个很大的禁忌。事实证明,我没有分配足够的空间来进行堆栈,当我将它从100字节增加到300字节时,问题就解决了。