汇编LINUX,x86-64-调用约定
我目前正在学习LINUX操作系统、x84-64处理器、GCC编译器的汇编语言基础知识,我遇到了一个尝试将以下C函数转换为汇编的示例:汇编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的值放在堆栈上,然后跳到它的参数显示的任何地方。在这种情况下,我理解到使用调用事实的程度。如果每次都执行
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