检查 SHL x86 汇编指令是否溢出

问题描述 投票:0回答:1

SHL EAX, CL
指令之后检查理论结果(EAX乘以(2次方CL))是否适合EAX的简单方法是什么?问题是关于无符号整数。

我希望能够在

ADD
指令的情况下检查进位标志,或者在
MUL
指令的情况下检查 EDX。

assembly x86 integer-overflow
1个回答
0
投票

您无法通过检查after说明来执行此操作。它不记录有关无符号溢出的信息,即是否有any 1 位被移出。进位标志仅包含移出的last位。

例如,如果 EAX = 0xF0000000 且 CL = 7,则

SHL EAX, CL
将使 EAX = 0 且进位标志清零。如果输入为 EAX = 0x00000000,您将获得完全相同的架构结果,包括所有其他标志值。所以即使一个有溢出,另一个没有,事后也没有办法区分它们。

您可以在指令之前通过检查EAX的高CL位是否为零来测试指令是否会溢出。例如(未经测试):

MOV EBX, 0x80000000 SAR EBX, CL ; now top CL+1 bits of EBX are 1 SHL EBX, 1 ; now top CL bits of EBX are 1 TEST EBX, EAX ; mask off all lower bits JNZ will_overflow
评论中建议了一些其他可能的算法(也许更好),例如

SHLD

对于一位移位指令

SHL EAX, 1

,那么进位标志确实表明是否发生无符号溢出。另外,溢出标志指示是否发生
signed溢出。事实上,所有 CF、OF、ZF、SF、PF 的设置与数学上等效的 ADD EAX, EAX
 的设置完全相同。因此,如果您要优化空间而不是速度,那么您可以考虑一个循环,迭代 CL 次并在每次迭代时执行 
SHL EAX, CL
,然后执行 
SHL EAX, 1
,而不是 
JC overflow_occurred

© www.soinside.com 2019 - 2024. All rights reserved.