我试图将一些 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)
答案 0 :(得分:4)
错误是“除以零”。 jl L001
离开循环if(n <0),但是如果(n <= 0)则它应该离开。因此将其更改为jle L001
(jle =跳跃,如果小于或等于)。
另外,leave
错了。没有需要逆转的序言。删除它。