assembly - 在轮类除法组装后舍入 Int

我需要能够在移位除法后对整数进行舍入,但我不能使用 muldiv 指令。

例子:

eax = 745

shr  eax, 3

这应该给我值 93,因为它截断了余数。但是假设浮点值是 749,使用 shr​​ 指令仍然会给我值 93,即使它通常会四舍五入到 94(学校评分)。

我将如何处理这个问题?

除法和乘法我只能使用shr​​/shl

最佳答案

被移出的部分是余数。为了正确舍入,您只需要它的最后一位,它保留在 CF 中:

    shr   eax, 3    ; div by 8, the last shifted bit is in the CF
    adc   eax, 0    ; if CF=1 eax will be increased by 1

它是如何工作的?移位除法时,余数包含在移出的位中:

745 = $2e9 = 001011101001
749 = $2ed = 001011101101 

右移时,低3位移出。请注意,只有最后移位的位会保留在 CF 中(由“^”指向)并且它是余数的最高位:

001011101001 shl 3 = 0000 0101 1101|001 = $05d|1 = 93 and remainder 1 (0 in CF)
                                    ^

001011101101 shl 3 = 0000 0101 1101|101 = $05d|5 = 93 and remainder 5 (1 in CF)
                                    ^

对于所有可能的余数 (0..111),最高位为 0 的是 000、001、010 和 011 (0..3),而最高位为 1 的是 100、101、110和 111 (4..7)。

所以,只有第二个例子会被四舍五入。

https://stackoverflow.com/questions/19486011/

相关文章:

php - 从 $_SERVER ['REQUEST_URI' 中删除父文件夹];

plot - 删除 gnuplot 自动标题键标签中的文件路径,只留下文件名

c# - .NET 中 SafeBuffer 和 SafeHandleZeroOrMinusOneI

regex - 是否可以在正则表达式中对变量值进行数学运算?

git - 将 git 提交与相同的消息结合起来?

recursion - 树的路径列表上的 F# 尾递归

git - 将多模块 Maven 项目放入 Jenkins

sql - 留在Access中的 "SQL Mode"?

intel - tboot 的文档?

git - 不支持的 Git 版本