x86左移算术溢出控制

时间:2011-09-14 10:54:21

标签: gcc assembly

您是否知道如何有效地检查x86左移算术上是否发生上溢/下溢?

1 个答案:

答案 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