在换班师大会后舍入一个Int

时间:2013-10-21 03:54:28

标签: assembly x86 nasm

我需要能够在移位分割后舍入整数,并且我无法使用muldiv指令。

示例:

eax = 745

shr  eax, 3

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

我将如何处理这个问题?

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

1 个答案:

答案 0 :(得分: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)。

因此,只会将第二个示例四舍五入。