在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)
有没有更好的方法来做到这一点,也许一个也适用于更一般的情况?
在递增1(使用add #1
,不是inc
)的情况下,您可以在sbc #0
之后实现饱和.类似地,减少1:使用sub #1
后跟adc #0
.
或者考虑使用SSE,它支持单个指令中的饱和整数算术运算.