/*////////////////////////////////////////////////////////////////////////////////////
从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
总是反汇编这种简单的没意思,打算加大难度了。噎死。。。
分享到:
相关推荐
C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言...
C语言库函数 C语言库函数 C语言库函数 C语言库函数
C语言中的库函数C语言中的库函数C语言中的库函数C语言中的库函数C语言中的库函数
C语言库函数手册,包含了大部分C语言库函数说明
C语言库函数 C语言库函数 C语言库函数
C语言库函数示例教程 C语言库函数示例教程 C语言库函数示例教程 C语言库函数示例教程 C语言库函数示例教程 C语言库函数示例教程 C语言库函数示例教程 C语言库函数示例教程 C语言库函数示例教程
C语言库函数大全 C语言库函数大全 C语言库函数大全
·C语言库函数速查 ·C语言库函数速查 ·C语言库函数速查 ·C语言库函数速查 ·C语言库函数速查 ·C语言库函数速查 ·C语言库函数速查
C语言库函数手册(20210926024352).pdf
C语言库函数.pdf 提供全部常用c语言库函数
C语言库函数大全 C语言库函数大全 C语言库函数大全 C语言库函数大全 C语言库函数大全 C语言库函数大全
C语言库函数 C语言库函数大全 C语言库函数 C语言库函数
C语言库函数:按各个字母开头的库函数都分开了的
C语言库函数及其示例,用于初学者学习C语言和掌握库函数
C语言库函数源代码。希望可以帮助到大家。
C语言库函数罗列。 提供了函数的原型,并有相关实例,可供查询,或学习使用方便的C语言库函数。