将伪代码翻译成汇编

Translate pseudo code to assembly

我正在尝试将一些 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    
    pop variables+52
    push    
    pop variables+72
    push    [=11=]
    pop variables+0
L000:
    push    variables+52
    push    [=11=]
    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    
    pop %ebx
    pop %eax
    sub %ebx,%eax
    push    %eax
    pop variables+52
    jmp L000
L001:
    push    variables+0
    push    $msg
    call    printf
    add ,%esp
leave
ret

我无法正确获取 运行 的代码。它会导致分段错误。我得到的输出是:

Message 0
Segmentation fault (core dumped)

错误是 "division by zero"。 jl L001 如果 (n<0) 则离开循环,但如果 (n<=0) 它应该离开。所以将其更改为 jle L001(jle = 小于或等于则跳转)。

另外,leave是错误的。没有需要反转的序言。删除它。