/*////////////////////////////////////////////////////////////////////////////////////
從buf所指內存區域的前count個字節查找字符ch。
說明:當第一次遇到字符ch時停止查找。如果成功,返回指向字符ch的指針;否則返回NULL。
*//////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <stdio.h>
void *pmesch(void *buf , int ch , int count);
int main(int argc, char* argv[])
{
char a1[]="abcdef";
int a2=99;
if (pmesch(a1,a2,4))
{
printf("查找成功\n");
}
else
printf("查找失敗\n");
return 0;
}
void *pmesch(void *buf , int ch , int count)
{
char temp_ch=(char)ch;
char *temp_buf=(char *)buf;
while (count--)
{
if (*temp_buf==temp_ch)
{
return temp_buf;
}
temp_buf++;
}
return 0;
}
函數很簡單,不說了,直接OD反彙編分析:
00401000 /$ 83EC 08 sub esp,8 ; 移動棧頂指針,給變量分配內存空間
00401003 |. A1 48704000 mov eax,dword ptr ds:[407048]
00401008 |. 66:8B0D 4C704>mov cx,word ptr ds:[40704C] ; cx=ef
0040100F |. 8A15 4E704000 mov dl,byte ptr ds:[40704E] ; 設置控制檯終端類型
00401015 |. 894424 00 mov dword ptr ss:[esp],eax
00401019 |. 6A 04 push 4
0040101B |. 8D4424 04 lea eax,dword ptr ss:[esp+4] ; 將eax由存放abcd的值變爲存放abcd的首地址
0040101F |. 6A 63 push 63
00401021 |. 50 push eax
00401022 |. 66:894C24 10 mov word ptr ss:[esp+10],cx ; 將ef存到abcd地址後面
00401027 |. 885424 12 mov byte ptr ss:[esp+12],dl
0040102B |. E8 30000000 call memch.00401060
00401030 |. 83C4 0C add esp,0C ; 堆棧平衡
00401033 |. 85C0 test eax,eax
00401035 |. 74 13 je short memch.0040104A
00401037 |. 68 3C704000 push memch.0040703C
0040103C |. E8 4F000000 call memch.00401090
00401041 |. 83C4 04 add esp,4
00401044 |. 33C0 xor eax,eax
00401046 |. 83C4 08 add esp,8
00401049 |. C3 retn
0040104A |> 68 30704000 push memch.00407030
0040104F |. E8 3C000000 call memch.00401090
00401054 |. 83C4 04 add esp,4
00401057 |. 33C0 xor eax,eax
00401059 |. 83C4 08 add esp,8
0040105C \. C3 retn
0040105D 90 nop
0040105E 90 nop
0040105F 90 nop
00401060 /$ 8B4C24 0C mov ecx,dword ptr ss:[esp+C] ; count=4
00401064 |. 8B4424 04 mov eax,dword ptr ss:[esp+4] ; eac存放a地址
00401068 |. 8BD1 mov edx,ecx ; while(count--) edx=4
0040106A |. 49 dec ecx ; ecx=3
0040106B |. 56 push esi
0040106C |. 85D2 test edx,edx ; while循環的判斷條件,只要edx!=0,zf=0;
0040106E |. 74 10 je short memch.00401080
00401070 |. 8A5424 0C mov dl,byte ptr ss:[esp+C] ; dl=c
00401074 |> 3810 /cmp byte ptr ds:[eax],dl ; 判斷指針所指位置值是否爲c
00401076 |. 74 0A |je short memch.00401082
00401078 |. 40 |inc eax
00401079 |. 8BF1 |mov esi,ecx
0040107B |. 49 |dec ecx
0040107C |. 85F6 |test esi,esi
0040107E |.^ 75 F4 \jnz short memch.00401074
00401080 |> 33C0 xor eax,eax
00401082 |> 5E pop esi
00401083 \. C3 retn
總是反彙編這種簡單的沒意思,打算加大難度了。噎死。。。