我通過拆卸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