Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
汇编LINUX,x86-64-调用约定_Linux_Gcc_Assembly_Stack_X86 64 - Fatal编程技术网

汇编LINUX,x86-64-调用约定

汇编LINUX,x86-64-调用约定,linux,gcc,assembly,stack,x86-64,Linux,Gcc,Assembly,Stack,X86 64,我目前正在学习LINUX操作系统、x84-64处理器、GCC编译器的汇编语言基础知识,我遇到了一个尝试将以下C函数转换为汇编的示例: unsigned long fact(unsigned n) { if (n<=1) return 1; else return n*fact(n-1); } 然而,我不知道这到底是怎么回事。根据我所读的内容,CALL指令将RIP的值放在堆栈上,然后跳到它的参数显示的任何地方。在这种情况下,我理解到使用调用事实的程度。如果每次都执行

我目前正在学习LINUX操作系统、x84-64处理器、GCC编译器的汇编语言基础知识,我遇到了一个尝试将以下C函数转换为汇编的示例:

unsigned long fact(unsigned n)
{
 if (n<=1) 
    return 1;
 else 
    return n*fact(n-1);
}

然而,我不知道这到底是怎么回事。根据我所读的内容,CALL指令将RIP的值放在堆栈上,然后跳到它的参数显示的任何地方。在这种情况下,我理解到使用调用事实的程度。如果每次都执行此指令,那么每次程序都将从开始开始启动,直到RDI==1,在这种情况下,它将跳转到retour_un,并且中间的所有内容都将永远不会执行。有人能解释一下我哪里弄错了,这段汇编代码实际上是如何工作的吗?

ret
当然会在调用
后继续执行,这样这些指令就会被执行。使用调试器单步执行代码,您将看到。Okeei,这现在有意义了。谢谢。
.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