将伪代码转换为汇编

时间:2015-11-05 20:29:08

标签: gcc assembly i386

我试图将一些 C 伪代码转换为i386汇编代码,但永远不会正确。

n=1;
s=50;
a=0;  
while(n > 0) {
   a=s/n;
   n=n-1;
}
print a;

上面的代码将通过编译器转换为汇编代码,从而产生:

.data
variables: .space 104
msg: .asciz "Message %d\n"
.text
.global main
main:
    push    $1
    pop variables+52
    push    $50
    pop variables+72
    push    $0
    pop variables+0
L000:
    push    variables+52
    push    $0
    pop %ebx
    pop %eax
    cmp %ebx,%eax
    jl  L001
    push    variables+72
    push    variables+52
    pop %ebx
    pop %eax
    xor %edx,%edx
    idivl   %ebx
    push    %eax
    pop variables+0
    push    variables+52
    push    $1
    pop %ebx
    pop %eax
    sub %ebx,%eax
    push    %eax
    pop variables+52
    jmp L000
L001:
    push    variables+0
    push    $msg
    call    printf
    add $8,%esp
leave
ret

我无法让代码正常运行。它导致分段错误。我得到的输出是:

Message 0
Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:4)

错误是“除以零”。 jl L001离开循环if(n <0),但是如果(n <= 0)则它应该离开。因此将其更改为jle L001(jle =跳跃,如果小于或等于)。

另外,leave错了。没有需要逆转的序言。删除它。