如果您只是除以2,解决方案很容易。 IDIV
让你在这种情况下,只有三种可能的余数:{} -1,0.1这意味着:
-1:总和为负值,小数点后面的数字为-0.5,平均必须是减1,即avg = avg + (-1)
。
0:无余数,平均值已经正确舍入,即avg = avg + 0
。
1:总和为正值,余数为0.5,必须加1,即avg = avg +1
。
正如你所看到的,有没有必要长篇大论的比较,你可以添加其余EDX
到EAX
:
; Only valid for EBX=2
mov eax, validSum
cdq ; EAX -> EDX:EAX
mov ebx, validInputs
idiv ebx ; EDX:EAX/EBX -> EAX remainder EDX
mov validAverage, eax ; Save result
add validAverage, edx ; Add -1 or 0 or 1
jmp display ; End of Rounding
除此之外,其余无关用十进制数的小数部分。这是完全错误的,直接与5或-5进行比较。你必须先得到第一个小数位。在一个长分区中,最后“加”一个0,然后除以除数。同样在这里:乘以十(=结尾加0)除以EBX
。现在,您可以通过5划分结果获得三重如上:{} -1,0.1
...
idiv ebx ; EDX:EAX/EBX
mov validAverage, eax ; Save result
mov eax, edx
add eax, eax ; A quick way to multiply by 10
lea eax, [eax + eax * 4] ; EAX * 10 = EAX * 2 + EAX * 8
cdq ; EAX -> EDX:EAX
idiv ebx ; EDX:EAX/EBX -> EAX remainder EDX
mov ebx, 5
cdq ; EAX -> EDX:EAX
idiv ebx
add validAverage, eax ; Add -1 or 0 or 1
jmp display ; End of Rounding
您可以将EAX*10/EBX/5
到EAX*2/EBX
:
mov eax, validSum
cdq ; EAX -> EDX:EAX
mov ebx, validInputs
idiv ebx ; EDX:EAX/EBX -> EAX remainder EDX
mov validAverage, eax ; Save result
imul eax, edx, 2 ; EAX = EDX * 2
cdq ; EAX -> EDX:EAX
idiv ebx ; EDX:EAX/EBX
add validAverage, eax ; Add -1 or 0 or 1
jmp display ; End of Rounding
如果您在调试器通过代码加强你会注意到其余的是负面的。你的代码不处理这种情况。 –