Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 将伪代码转换为程序集_Gcc_Assembly_I386 - Fatal编程技术网

Gcc 将伪代码转换为程序集

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

我正试图将一些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)

误差为“零除”<代码>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)是对代码进行单步检查的一种方法。它更容易看出代码是如何出错的以及是什么导致了错误。