我试图解释这个IA32汇编语言代码

时间:2014-04-28 16:02:20

标签: 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     .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)
{

}

1 个答案:

答案 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;
}