字符串操作实践[内联汇编实现]

  以下代码在VC6下编译测试通过
  函数实现: /************************************************* **********************/ /* 比较两个字符串是否相等 */ /************************************************* *********************/ bool isEqual(const char * str1,const char * str2) { // if (strlen(str1)!=strlen(str2)){//长度不相等则不相等 // return false; // } //对上面判断语句的汇编实现 __asm { push [ebp+0x8] //str1地址入栈 call strlen //调用c函数获取长度 add esp,4 //堆栈平衡[c调用约定"__cdecl"规定由函数的调用者释放堆栈] mov ebx,eax //存放比较结果,为了避免后面再次调用strlen函数引起返回值覆盖[函数的返回值规范约定保存在eax里面] push [ebp+0xc] //str2地址入栈 call strlen //调用c函数获取长度[函数的返回值规范约定保存在eax里面] add esp,4 //堆栈平衡[c调用约定"__cdecl"规定由函数的调用者释放堆栈] cmp eax,ebx //比较两个字符串的长度 jne exit2 //不相等则跳转到 exit2 } // for (;str1字符串是否以某个子字符串开始
  函数: /************************************************* ***********************/ /*检查是否以prefix开始 */ /* content:整个字符串 */ /* prefix: 要查找的字符串 */ /* result: 返回的值 */ /************************************************* ***********************/ void _stdcall startWith(const char * pContent,const char * pPrefix,bool * pResult) { // if (pContent==NULL || pPrefix == NULL || strlen(pContent)ebx call strlen; add esp,4 mov ebx,eax push [ebp+0xc] //strlen(pPrefix)-->eax call strlen add esp,4 cmp ebx,eax //strlen(pContent)al mov ebx,pc mov bl,byte ptr [ebx] //*pc-->bl cmp al,bl //if (*pp!=*pc) jne exitwithfalse //发现不通的字符则退出循环 add pp,type char //pp++ add pc,type char //pc++ jmp beginfor //继续下一轮循环 } //*pResult =true; __asm { endfor: jmp exitwithtrue } __asm { exitwithfalse: mov eax,[ebp+0x10] mov [eax],0 //*pResult=0 jmp exit exitwithtrue: mov eax,[ebp+0x10] mov [eax],1 //*pResult=1 exit: //退出 } } 测试代码: int main(int argc, char* argv[]) { char content[] = "welcome to you"; char prefix[] ="welcome"; char msg1[] = "包含"; char msg2[] = "不包含"; char fmt[] = "%s\n"; bool result = false; bool * pResult = &result; // startWith(content,prefix,&result); // printf("%s\n",result?"包含":"不包含"); //以下是汇编实现版本 __asm { push pResult //传递第三个参数 lea eax,prefix //传递第二个参数--取数组首地址 push eax //传递第二个参数 lea eax,content //传递第一个参数--取数组首地址 push eax //传递第一个参数 call startWith //调用函数[该函数采用__stdcall约定,将由北调用函数自身负责堆栈的平衡] cmp result,1 //比较结果是否为1[true] je processeq; //如果为1说明包含,跳转到processeq处理显示包含信息 lea eax,msg2 //否则说明不包含--取msg2数组首地址 push eax //否则说明不包含--传递第二个参数 lea eax,fmt //传递第一个参数--取数组fmt首地址 push eax //传递第一个参数 call printf //调用函数输出信息 add esp,8 //堆栈平衡 jmp exit //程序结束 processeq: //处理包含的情况 lea eax,msg1 //取数组msg1的首地址 push eax //第二个参数入栈 lea eax,fmt //去数组fmt的首地址 push eax //第一个参数入栈 call printf //调用函数输出信息 add esp,8 //堆栈平衡 exit: //程序结束 } return 0; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值