2017-05-07 77 views
0

在我的程序中,我试图计算两个整数的平均值,然后舍入数字。例如,如果平均值为-22.5,则它将舍入到-23。 validInputs是从用户收集到的有效输入的数量,并且始终为正整数,而validSum将始终为负整数,因为它仅添加负整数。但是,当比较余数时,我没有得到正确的舍入结果,并且想知道为什么。MASM - 舍入整数

编辑:我建议更改为-5,但仍然遇到同样的错误。我相信我的错误肯定是一个合乎逻辑的问题。

mov  eax, validSum 
cdq 
mov  ebx, validInputs 
idiv ebx 
mov  validAverage, eax 
mov  intRemainder, edx 
cmp  edx, -5 ; compare the remainder to -5 
jg  display ; if greater than -5 we know not to round/decrement 
dec  validAverage 
+0

如果您在调试器通过代码加强你会注意到其余的是负面的。你的代码不处理这种情况。 –

回答

1

如果您只是除以2,解决方案很容易。 IDIV让你在这种情况下,只有三种可能的余数:{} -1,0.1这意味着:

  • -1:总和为负值,小数点后面的数字为-0.5,平均必须是减1,即avg = avg + (-1)

  • 0:无余数,平均值已经正确舍入,即avg = avg + 0

  • 1:总和为正值,余数为0.5,必须加1,即avg = avg +1

正如你所看到的,有没有必要长篇大论的比较,你可以添加其余EDXEAX

; 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/5EAX*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