我有这个IA32汇编语言代码我正在尝试转换为常规C代码。
.globl fn
.type fn, @function
fn:
pushl %ebp #setup
movl $1, %eax #setup 1 is in A
movl %esp, %ebp #setup
movl 8(%ebp), %edx # pointer X is in D
cmpl $1, %edx # (*x > 1)
jle .L4
.L5:
imull %edx, %eax
subl $1, %edx
cmpl $1, %edx
jne .L5
.L4:
popl %ebp
ret
我遇到的麻烦是决定进行什么类型的比较。我不知道程序如何进入L5缓存。 L5似乎是一个循环,因为它内部有一个比较。我也不确定返回的是什么,因为似乎大部分工作都是%edx寄存器,但是不会返回%eax返回。
到目前为止我所拥有的:
int fn(int x)
{
}
答案 0 :(得分:0)
在我看来,它喜欢计算一个因子。忽略堆栈框架操作等,我们留下:
movl $1, %eax #setup 1 is in A
将1放入eax。
movl 8(%ebp), %edx # pointer X is in D
将参数检索到edx
imull %edx, %eax
将edx乘以ex,将结果放入eax。
subl $1, %edx
cmpl $1, %edx
jne .L5
如果edx!= 1,则递减edx并重复。
换句话说,这大致相当于:
unsigned fact(unsigned input) {
unsigned retval = 1;
for ( ; input != 1; --input)
retval *= input;
return retval;
}