汇编代码为C.

时间:2014-04-28 19:37:48

标签: c assembly

我正在为C练习一些汇编代码,需要两个问题的帮助。基于GCC objdump它看起来没问题,但我想确保我可以在没有计算机的情况下完成此操作(仍然是汇编代码的新功能)

问题1:

q1:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    cmpl    $0, 8(%ebp)\\ compare variable1 to zero
    jle .L2 \\jump if less than or equal to zero
    movl    $1, -4(%ebp)\\ ?? variable2 = 1??
    jmp .L4\\else 
.L2:
    movl    $0, -4(%ebp)\\ variable2 = 0
.L4:
    movl    -4(%ebp), %eax\\ variable2 = variable1
    leave
    ret

我得到的是

int main(int x, int z)  
{
    if (x < 0)
        z = 0;
    else
        z = x;
 }

但我不确定movl $1, -4(%ebp)的目的是什么。

问题2:

fn:
    pushl   %ebp
    movl    $1, %eax
    movl    %esp, %ebp
    movl    8(%ebp), %edx 
    cmpl    $1, %edx\\ compare variable1 to 1
    jle .L4\\ less than or equal jump.
.L5:
    imull   %edx, %eax\\ multiply variable1 by variable 2
    subl    $1, %edx\\ variable1 -1
    cmpl    $1, %edx\\ compare variable1 with 1
    jne .L5 Loop if not equal
.L4:
    popl    %ebp\\ return value
    ret

我如何解释信息

int main(int x)
{
    int result;
    if (x <= 1){
    for (result=1; x != 1; x = x-1)
            result *= x;}
    else{return result;}
}

不确定我的逻辑是否正确。

1 个答案:

答案 0 :(得分:4)

Q1 您在8(%ebp)有一个参数-4(%ebp)和一个局部变量。返回值将在%eax。知道这一点,该功能看起来更像:

int foo(int arg)
{
    int local;
    if (arg <= 0) {
        local = 0;
    } else {
        local = 1;
    }
    return local;
}

Q2 popl %ebp // return value这不是返回值,即恢复已保存的%ebp调用者(在开头推送)。 此外,循环中的条件应使用>而不是!=您在if (x > 1)循环周围缺少for条件。 (感谢Mooing Duck指出这一点。)另外,从技术上讲,这是一个do - while循环。否则你就有了这个功能。

int factorial(int x)
{
    int result = 1;
    if (x > 1) {
        do {
            result *= x;
            x -= 1;
        } while(x != 1);
    }
    return result;
}