首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MASM -舍入整数

MASM -舍入整数
EN

Stack Overflow用户
提问于 2017-05-07 18:06:34
回答 1查看 2.3K关注 0票数 0

在我的程序中,我试图计算两个整数的平均值,然后再把这个数字除以。例如,如果平均值为-22.5,则为-23。validInputs是从用户收集的有效输入数,它总是一个正整数,而validSum总是一个负整数,因为它只添加负整数。然而,在比较剩余部分时,我没有得到正确的四舍五入的结果,并且想知道为什么。

编辑:我建议的更改为-5,但仍在经历相同的错误。我相信我的错误一定是一个合乎逻辑的问题。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-05-08 20:39:32

如果你只把它除以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中即可。

代码语言:javascript
复制
; 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}

代码语言:javascript
复制
...
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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43834912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档