Gcc 将伪代码转换为程序集
我正试图将一些C伪代码翻译成i386汇编代码,但始终没有正确执行Gcc 将伪代码转换为程序集,gcc,assembly,i386,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
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)
误差为“零除”<代码>jl L001如果(n错误为“零除”,则离开循环。
jl L001
如果(您知道存在一种允许您将值从内存移动到寄存器的方法。您使用一种效率较低的方法将内容推送到堆栈上并将其弹出到目标中。这将简化为a=s/1
(即仅s)如果n
最初为>0,则保持a
不变。无需在asm中实际创建循环。您知道存在一个允许您将值从内存移动到寄存器的方法。您使用一种效率较低的方法将堆栈上的内容推送到目标。这简化为a=s/1
(即仅为s)如果n
最初是>0,否则保持a
不变。实际上没有必要在asm中进行循环。谢谢。我已经在这个编译器上工作了三天多一点了,我的脑袋开始有点乱。@seb:我建议使用GCC-g3
选项来添加调试信息。然后se GNU调试器(gdb)一步一步地完成你的代码。很容易看出你的代码是如何出错的以及是什么导致了错误。谢谢你。我已经在这个编译器上工作了三天多一点了,我的头脑开始有点混乱。@seb:我建议使用GCC-g3
选项来添加调试信息。然后使用GNU调试ger(gdb)是对代码进行单步检查的一种方法。它更容易看出代码是如何出错的以及是什么导致了错误。