【发布时间】:2021-09-27 16:30:19
【问题描述】:
我对分解阶乘函数感到困惑。
C 代码
long factorial(int x)
{
long result = 1;
while (x > 1)
{
result = result * x;
x= x - 1;
}
return result;
}
我使用 gcc 命令来反汇编阶乘函数
gcc -S -O1 test.c
factorial:
.LFB0:
cmpl $1, %edi
jle .L2
movslq %edi, %rdx
leaq -1(%rdx), %rcx
leal -2(%rdi), %eax
subq %rax, %rcx
movl $1, %eax
.L3:
imulq %rdx, %rax
subq $1, %rdx
cmpq %rcx, %rdx
jne .L3
.L2:
movl $1, %eax
rep ret
我不明白下面的代码是做什么的,有人可以帮助我吗?
movq %rax, %rdx
leaq -1(%rax), %rcx
leal -2(%rdi), %esi
subq %rsi, %rcx
【问题讨论】:
-
仅供参考,功能不正确。它又乘以
x。 -
那些正在设置和访问参数
x和局部变量result。 -
OT:
long result =x;-->long result =1; -
OT:您在
long中计算但返回int -
很奇怪,看起来 GCC7(与您的 asm godbolt.org/z/jMhjsvfdM 匹配,后来 GCC 省略了 rep 前缀)正在以非常复杂的方式计算 RCX 中的循环结束条件。即使在
-O2,这也不是仅启用部分优化 (-O1) 的结果,尽管早期的 GCC 没有这样做。例如GCC 4.9 -O1 只是按书面方式编译。 godbolt.org/z/1PPndxo4v。您可以将其报告为 GCC 的 bugzilla 上的一个错过优化错误