轮到寄存器最多 8 的倍数

Round Register up to multiple of 8

我正在尝试将 64 位寄存器四舍五入为 8 的倍数。因此它以 8 或 0 结尾。

有没有高效的方法,我目前是这样操作的:

xor r9, r9
_R:
    add r9, 08h
    cmp r8, r9
ja _R
mov r8, r9

要将值四舍五入为八的倍数需要两个语句并且没有循环:

add r9, 7
and r9, 0fffffffffffffff8H

第一个将 还不是 八的倍数的任何值移动到 "next highest section" 中。第二轮将 向下 为八的倍数。所以你会得到如下结果:

orig  add  and
   0    7    0
   1    8    8
   :    :    :
   7   14    8
   8   15    8
   9   16   16

请注意,如果您想要对 已经 八的倍数(例如 8 -> 16)的数字进行四舍五入,只需加八而不是七。