`
mv776mv
  • 浏览: 13911 次
社区版块
存档分类
最新评论

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

 
阅读更多

  以下代码在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; }
分享到:
评论

相关推荐

    c语言、汇编语言,交叉编译技术

    c语言、汇编语言,交叉编译技术c语言、汇编语言,交叉编译技术

    C++反汇编视频教程(代码+课件+视频全套价值300元的付费教程)

    寄存器 寻址方式 常用汇编指令 C++内联汇编 C++入口函数 反汇编识别main函数 第二讲 整型与浮点型 第三讲 指针与常量 第四讲 布尔型与字符(串) 第五讲 表达式 第六讲 选择结构 第七讲 循环结构 第八讲 变量 第九讲...

    Visual C++ 2005入门经典--源代码及课后练习答案

    他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工...

    易语言-eWOW64Ext v1.21 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写

    使用过动态调用DLL的都清楚取模块基址和函数指针,微软默认使用字符串对比,本模块可使用哈希对比效率和易用上相对提升,本函数用于计算模块或函数哈希 X64Call 调用 64 位函数通用版本 X64CallArr 调用 64 位函数...

    宋劲彬的嵌入式C语言一站式编程

    5. C内联汇编 6. volatile限定符 20. 链接详解 1. 多目标文件的链接 2. 定义和声明 2.1. extern和static关键字 2.2. 头文件 2.3. 定义和声明的详细规则 3. 静态库 4. 共享库 4.1. 编译、链接、运行 4.2. 动态链接的...

    C++大学教程,一本适合初学者的入门教材(part2)

    5.12.2 字符串处理库的字符串操作函数 5.13 有关对象的思考:对象间的交互 小结 术语 自测练习 自测练习答案 练习 特殊小节:建立自己的计算机 更多的指针练习 字符串操作练习 特殊小节:高级字符串操作练习 复杂...

    C++大学教程,一本适合初学者的入门教材(part1)

    5.12.2 字符串处理库的字符串操作函数 5.13 有关对象的思考:对象间的交互 小结 术语 自测练习 自测练习答案 练习 特殊小节:建立自己的计算机 更多的指针练习 字符串操作练习 特殊小节:高级字符串操作练习 复杂...

    C语言入门经典(第4版)--源代码及课后练习答案

    6.3 字符串操作 206 6.3.1 连接字符串 206 6.3.2 字符串数组 208 6.4 字符串库函数 210 6.4.1 使用库函数复制字符串 210 6.4.2 使用库函数确定字符串的长度 211 6.4.3 使用库函数连接字符串 212 6.4.4 比较...

    VB防破解初探 CRC32 添加校验值到目标程序.rar

     就简单的一句话就交代了 ^_^我们已经写好了GetCRC32函数和GetZHI函数,两个函数返回值为字符串,当然,我们只是做测试,如果真的要,应用到软件中去,我推荐还是用浮点计算,制造隐藏剧情,甚至内联汇编处理,根据CRC32...

    Windows内核安全与驱动开发光盘源码

    3.1 字符串操作 35 3.1.1 使用字符串结构 35 3.1.2 字符串的初始化 36 3.1.3 字符串的拷贝 37 3.1.4 字符串的连接 38 3.1.5 字符串的打印 38 3.2 内存与链表 40 3.2.1 内存的分配与释放 40 3.2.2 使用LIST_...

    Windows内核安全驱动开发(随书光盘)

    3.1 字符串操作 35 3.1.1 使用字符串结构 35 3.1.2 字符串的初始化 36 3.1.3 字符串的拷贝 37 3.1.4 字符串的连接 38 3.1.5 字符串的打印 38 3.2 内存与链表 40 3.2.1 内存的分配与释放 40 3.2.2 使用LIST_...

    Bubble BASIC:适用于Linux的免费,最小的64位BASIC编译器-开源

    *功能齐全的BASIC编译器(功能齐全的大约在1980年代/ Commodore 64时代!)*几乎支持所有熟悉的BASIC命令(打印,输入,IF ...则,GOTO,GOSUB,DATA等)*支持许多BASIC功能(SIN... *内联汇编功能。 *写在Haskell和C。

    Practical-C-Programming:实用C编程,由Packt发布

    探索如何使用数组,函数和字符串来创建大型应用 执行预处理和条件编译以进行高效编程 了解如何最佳使用指针和内存 使用通用实用程序并提高代码的性能 使用线程和进程同步实现多任务 探索低级编程和内联汇编语言 ...

    Reversing:逆向工程揭密

    7.2.3 字符串过滤程序 256 7.2.4 整数溢出 256 7.2.5 类型转换错误 260 7.3 案例研究:IIS索引服务漏洞 262 7.3.1 CVariableSet:: 7.3.1 AddExtensionControlBlock 263 7.3.2 DecodeURLEscapes 267 7.4 结论 271 第8...

    sicp-to-z80:一台SICP寄存器机到TI-84 Z80编译器

    特征显示字符串和数字,将它们保存到寄存器和堆栈中并还原它们。 32位数字(哦,甜美的上溢/下溢!)。 定义要在注册机器程序中使用的过程。 SICP的所有麻烦都注册了机器语言,而Z80则没有麻烦。如何使用首先,使用...

    McGraw C++程序调试实用手册

    第7章 调试内联汇编语言代码 7.l 汇编语言初步 7.1.l 数据类型 7.1.2 寄存器 7.1.3 寻址模式 7.1.4 指针 7.1.5 协处理器 7.2 调试 7.2.l 减法运算 7.2.2 使用256位整数 7.2.3 程序循环 7,2.4 ...

    语言程序设计课后习题答案

    //输出字符串Welcome to c++! } 在屏幕输出如下: Hello! Welcome to c++! 2-4 使用关键字const而不是#define语句的好处有哪些? 解: const定义的常量是有类型的,所以在使用它们时编译器可以查错;而且,这些...

    美国..现代编译原理C语言描述.高清版

    7.2.10 字符串 117 7.2.11 记录和数组的创建 118 7.2.12 while循环 119 7.2.13 for循环 119 7.2.14 函数调用 120 7.3 声明 120 7.3.1 变量定义 120 7.3.2 函数定义 120 7.3.3 片段 121 程序设计:翻译成树 122 习题 ...

Global site tag (gtag.js) - Google Analytics