x86汇编:ADD/SUB/INC/DEC没有溢出和分支

1 assembly integer-overflow

在x86 ASM中,在没有分支的情况下添加或减去时是否可以禁止溢出?因此,例如,当从0x01中减去0x02时,它将设置0x00而不是0xFF.

我希望这可能是不可能的,所以我也对这个问题的更受限制的形式的答案感兴趣,其中只增加/减去0x01.我有一个这样的想法(OF是溢出标志):

dec eax
add eax,OF
Run Code Online (Sandbox Code Playgroud)

我不知道其他架构,但对于i386我找不到这个操作码,因为显然标志不能被解释为整数并用于算术运算.我找到了一个可行的解决方案,但仅在未使用较高字节时的最低字节:

dec ax
sub al,ah
xor ah,ah
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,也许一个也适用于更一般的情况?

Pau*_*l R 5

在递增1(使用add #1,不是inc)的情况下,您可以在sbc #0之后实现饱和.类似地,减少1:使用sub #1后跟adc #0.

或者考虑使用SSE,它支持单个指令中的饱和整数算术运算.

  • _"在递增1的情况下......"_只要不使用`INC`完成该增量,因为`INC`不会影响进位标志. (2认同)