您是否知道如何有效地检查x86左移算术上是否发生上溢/下溢?
答案 0 :(得分:2)
在换档前检查换档计数。如果移位计数大于位数,则会出现溢出。
通常你会检查这个标志。但是,您不能真正依赖SHL
(或SAL
这是相同的指令)。查看软件开发人员手册:
受影响的旗帜
CF标志包含从目标操作数移出的最后一位的值;对于SHL和SHR指令,它是未定义的,其中计数大于或等于目标操作数的大小(以位为单位)。 OF标志仅受1位移位的影响(参见上面的“描述”);否则,它是未定义的。根据结果设置SF,ZF和PF标志。如果计数为0,则标志不受影响。对于非零计数,AF标志未定义。
最好的方法是确保移位计数在字节操作时<4;对于字,<5;对于双字而言,<6,对于四字,在移位之前<7。
修改强>
我误读了规范。如果移位计数不大于目标操作数,则可以检查CF标志以查看最后一位移出的位。如果您一次执行一次移位,您可以在每次移位后测试CF,看看是否有1在任何点移出,这表示溢出。
另一种选择是在左移后执行算术移位右,看看你是否有相同的数字:
mov ebx, eax
sal eax, ecx
sar eax, ecx
cmp ebx, eax
jnz overflow