gpt4 book ai didi

function - 为什么这个程序集产生 24 而不是 4?

转载 作者:行者123 更新时间:2023-12-02 22:12:58 26 4
gpt4 key购买 nike

我无法理解以下代码的工作原理。这是一段简单的代码,使用递归函数来查找数字的阶乘。在本例中,4*3*2*1 = 24

.section .data
.section .text
.globl _start
._start:

pushl $4
call factorial
addl $4, %esp

movl %eax, %ebx
movl $1, %eax
int $0x80

.type factorial, @function
factorial:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax

cmpl $1, %eax
je end_factorial
decl %eax
pushl %eax
call factorial
movl 8(%ebp), %ebx
imull %ebx, %eax

end_factorial:
movl %ebp, %esp
popl %ebp
ret

我了解有关代码的所有内容,但我不明白为什么要执行此部分(第 25/26 行)。

movl 8(%ebp), %ebx
imull %ebx, %eax

我的理解(这显然是错误的)是,该函数将不断调用自身,直到 %eax 的值为 1。此时它将把“4”乘以 %eax,结果是 1。这将给出值 4,这对于 4 的阶乘来说是完全错误的。然而,当我运行它时,它实际上给出了正确的输出 24。我认为每次函数都应该执行乘法指令执行,而不是在函数完成调用自身之后执行。

有人可以检查一下代码并向我解释一下为什么代码实际上给出了正确答案 24,而不是我认为应该给出的答案 (4)。

并且每次在函数内部调用该函数时,ebp get都会压入堆栈并会更改为esp。 (推%ebp 移动%esb,%ebp)。如果是这样,我们如何在函数结束时将 esp,ebp 值恢复为初始值。 (据我了解,pop 是在 end_function 处执行的,我们已经多次调用该函数,从而多次将 ebp、return、eax 压入堆栈)。这真的很困惑我的组装逻辑正在崩溃。请有人定期解释一下堆栈发生了什么,并在每一点进行注册。

最佳答案

请记住,函数的返回值始终放入 %eax

汇编函数遍历并调用阶乘,每次将 %eax 减 1 并将其压入堆栈。当%eax为1时,最终返回。当 %eax 为 2 时,这会让您回到递归调用中的调用阶乘,它存储在 8(%ebp) 中(回想一下它被推了)。所以现在你有 2*1=2=%eax。现在它完成并再次返回,并且重复该过程,直到返回到首先调用 factorial 的函数。

关于function - 为什么这个程序集产生 24 而不是 4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com