Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么使用push指令而不是覆盖内存位置%esp点会在递归过程中导致不明确的行为_Assembly_X86 - Fatal编程技术网

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字节时,问题就解决了。