C I';我试图解释这个IA32汇编语言代码

C I';我试图解释这个IA32汇编语言代码,c,assembly,C,Assembly,我有一个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

我有一个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)
{

}

在我看来,这就像是在计算阶乘。忽略堆栈帧操作等,我们只剩下:

movl    $1, %eax #setup 1 is in A
将1放入eax

movl    8(%ebp), %edx # pointer X is in D
subl    $1, %edx
cmpl    $1, %edx
jne     .L5
将参数检索到edx中

imull   %edx, %eax
将eax乘以edx,将结果放入eax

movl    8(%ebp), %edx # pointer X is in D
subl    $1, %edx
cmpl    $1, %edx
jne     .L5
如果edx!=一,

换句话说,这大致相当于:

unsigned fact(unsigned input) { 
    unsigned retval = 1;

    for ( ; input != 1; --input)
        retval *= input;
    return retval;
}

我将从生成英特尔格式的汇编代码开始,这样您至少可以从可读性有一半的代码开始。谢谢,这很有意义。发生在
jle
上的事情不应该有
input@user3395013:这在循环的顶部有一个测试,在循环的底部有另一个测试。你可以把它翻译成一个
if
,里面有一个
do
/
while
,但是像
for
或者
while
这样的循环会更常见。顶部的测试仅用于控制循环的第一次迭代。其他迭代由底部的测试控制。