我通过拆卸win32的C++程序读,我看到不少:“AND AL,0xFF”的用途是什么?
AND AL,0xFF
这是完全没有意义的,或者为什么会编译器生成这些?
这是一个较长的例子:
movsx eax, byte ptr [ebx]
shl eax, 18h
movsx edx, byte ptr [ebx+1]
shl edx, 10h
add eax, edx
movsx ecx, byte ptr [ebx+2]
shl ecx, 8
add eax, ecx
movsx edx, byte ptr [ebx+3]
add eax, edx
xor edx, edx
call sub_43B55C
mov ecx, eax
mov edx, eax
sar ecx, 10h
and al, 0FFh # <----
sar edx, 8
and cl, 0FFh # <----
mov [esi], cl
and dl, 0FFh # <----
mov [esi+1], dl
mov [esi+2], al
add ebx, 4
add esi, 3
inc ebp
cmp ebp, 6
jl short loc_43B5E4
标志不能被这些操作之后检查以致不能成为目的。在AND
之后,AL
,CL
和DL
中的值正被移至[ESI + n]
。
不知道之前发生了什么,很难说。假设EAX是一个指针,它需要在一个16字节的边界上对齐。这将设置ZF为真,因此指令的要点是设置标志。或者,如果编译器设置适当,可能会使用'test al,0xff'。 –
感谢您的评论。标志没有被检查。 ANDing似乎在将字节移到内存之前发生。我使用周围的代码更新了上下文。 – user35358
似乎很奇怪。也许这条指令是用于填充或作为钩子的标记。 – fuz