一个小过程,用于检测字符串是否为空,dwOffset为字符串首地址
IsEmpty proc dwOffset:DWORD
xor ecx,ecx
cmp byte ptr [dwOffset],0
je @f
inc ecx
@@:
ret
IsEmpty endp
编译之后没达到预期效果,因为编译出来的代码有问题
如下
0040101A /$ 55 push ebp
0040101B |. 8BEC mov ebp, esp
0040101D |. 33C9 xor ecx, ecx
0040101F |. 807D 08 00 cmp byte ptr [ebp+8], 0
00401023 |. 74 01 je short 00401026
00401025 |. 41 inc ecx
00401026 |> C9 leave
00401027 \. C2 0400 retn 4
在此程序中
[ebp+8] = dwOffset
因此[dwOffset] = [[ebp+8]]
但编译出来的代码明显把[dwOffset]=[ebp+8]了
对这个过程做一下改进
IsEmpty proc dwOffset:DWORD
xor ecx,ecx
mov eax,dwOffset
mov al,[eax]
cmp al,0
je @f
inc ecx
@@:
ret
IsEmpty endp
效果达到了
再来看看编译出的代码
0040101A /$ 55 push ebp
0040101B |. 8BEC mov ebp, esp
0040101D |. 33C9 xor ecx, ecx
0040101F |. 8B45 08 mov eax, dword ptr [ebp+8]
00401022 |? 8A00 mov al, byte ptr [eax]
00401024 |? 3C 00 cmp al, 0
00401026 |> 74 01 je short 00401029
00401028 ? 41 inc ecx
00401029 ? C9 leave
0040102A $ C2 0400 retn 4
第一次编译器为什么会把[dwOffset]编译为[ebp+8]呢?
编译工具为MASM32 Version 9.00 Release
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!