如果您只是除以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
如果您在調試器通過代碼加強你會注意到其餘的是負面的。你的代碼不處理這種情況。 –