在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假设为结束的循环)。
我哪里出错了?
答案 0 :(得分:0)
你的循环在ecx和eax的比较中终止。 eax设置为0,但ecx似乎没有保持倒计时值。此外,您确定您的功能正确保留了您的寄存器值吗?
嗯,我敢打赌你的所有函数在返回时都在修改eax - 这就是存储返回值的地方。将您的eax分配0(或'0'/ $ 30)向下移至比较前。无论如何都不需要设置它。