【发布时间】:2017-07-27 21:33:30
【问题描述】:
我正在阅读一个反汇编的 win32 c++ 程序,我看到了很多:
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 似乎在字节被移动到内存之前发生。我用周围的代码更新了上下文。
-
看起来很奇怪。也许这个指令用于填充或作为钩子的标记。
-
也许它只是一个优化不佳的编译器,未能优化掉成语
foo = bar & 0xff。什么程序生成了这个代码? -
@fuz :恕我直言,这是最有可能发生的情况,因为代码看起来像一些二进制/位级(重新)打包函数。
标签: assembly bitwise-operators eflags