我目前正在学习LINUX OS,x84-64处理器,GCC编译器的汇编语言基础知识,并且我遇到了一个例子,它尝试将以下C函数转换为汇编语言:
unsigned long fact(unsigned n)
{
if (n<=1)
return 1;
else
return n*fact(n-1);
}
这是建议的解决方案:
.intel_syntax noprefix
.text
.global fact
.type fact, @function
fact: PUSH RBP
MOV RBP, RSP
CMP EDI, 1
JBE retour_un
PUSH RDI
DEC RDI
SUB RSP, 8
CALL fact
ADD RSP, 8
POP RDI
MUL RDI
JMP retour
retour_un: MOV RAX, 1
retour: POP RBP
RET
然而,我并不完全知道这是如何运作的。根据我的阅读,CALL指令在堆栈上放置RIP的值,然后跳转到其参数显示的位置。在这种情况下,我理解到使用CALL事实的地步。如果每次都执行该指令,则每次程序从开始开始直到RDI == 1,在这种情况下,它将跳转到retour_un,其间的所有内容将永远不会被执行。有人可以向我解释我错在哪里以及这段汇编代码实际上是如何运作的吗?