2

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

例子:

eax = 745

shr  eax, 3

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

我将如何处理这个问题?

我可以用于除法和乘法的是shr/ shl

4

1 回答 1

2

移出的部分是剩余部分。对于正确的舍入,您只需要最后一点,它保留在 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)。

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

于 2013-10-21T06:03:24.043 回答