在我的程序中,我试图计算两个整数的平均值,然后再把这个数字除以。例如,如果平均值为-22.5,则为-23。validInputs是从用户收集的有效输入数,它总是一个正整数,而validSum总是一个负整数,因为它只添加负整数。然而,在比较剩余部分时,我没有得到正确的四舍五入的结果,并且想知道为什么。
编辑:我建议的更改为-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发布于 2017-05-08 20:39:32
如果你只把它除以2,那么求解就很容易了。在这种情况下,IDIV只给出三个可能的余数:{-1,0.1},这意味着:
avg = avg + (-1)。avg = avg + 0。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,然后除以除数。在这里也是一样:乘以10 (=在末尾加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 Roundinghttps://stackoverflow.com/questions/43834912
复制相似问题