试图总结数字,但循环不会停止

时间:2011-12-16 16:48:46

标签: assembly average

在Assembly中给出以下代码:

.section .rodata

input_format:  .string  "%d"
output_format: .string  "%d\n"

    .text
    .globl  main
    .type   main,@function
main:
    pushl   %ebp
    movl    %esp,%ebp

    movl    $0,%ebx     # reset the sum register
    movl    $0,%esi     # reset the counter of the numbers
    movl    $0,%eax     # in order to know when to stop the loop
.loop:
    addl    $-8,%esp    # moving down the stack
    pushl   %esp
    pushl   $input_format
    call    scanf       # call scanf to get number from the user
    addl    $8,%esp
    addl    (%esp),%ebx # add the number to the total summary
    movl    (%esp),%ecx
    addl    $1,%esi     # add 1 to the counter
    pushl   $output_format
    call    printf      # print the given number
    cmpl    %ecx,%eax
    jne .loop

    # return from printf:
    movl    $0,%eax
    movl    %ebp,%esp
    popl    %ebp
    ret

我试图在ebx中对大于0的数字求和,并最终计算它们的平均值,但是由于某种原因,当我输入“0”时,循环不会停止(0假设为结束的循环)。 我哪里出错了?

1 个答案:

答案 0 :(得分:0)

你的循环在ecx和eax的比较中终止。 eax设置为0,但ecx似乎没有保持倒计时值。此外,您确定您的功能正确保留了您的寄存器值吗?

嗯,我敢打赌你的所有函数在返回时都在修改eax - 这就是存储返回值的地方。将您的eax分配0(或'0'/ $ 30)向下移至比较前。无论如何都不需要设置它。