程序集LINUX,x86-64 - 调用约定

时间:2018-06-01 23:17:06

标签: linux gcc assembly stack x86-64

我目前正在学习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,其间的所有内容将永远不会被执行。有人可以向我解释我错在哪里以及这段汇编代码实际上是如何运作的吗?

0 个答案:

没有答案