5.arm-REPNZ、SCANS、CMPS(比较字符串相关,随手代码)
来源:互联网 发布:网络教育 统考 编辑:程序博客网 时间:2024/05/17 13:38
自己的随手汇编,不保证质量
1.快速查找两段内存的不同处:
char *pSrc = new char[100];memset(pSrc,0x10,100);char *pDest = new char[100];memset(pDest,0x10,100);pDest[51] = 0x20;// 52个字节处变了int nCmp = 100;__asm{pushadpushfdmov ecx,100 // 要比较的长度mov esi,pSrcmov edi,pDestrepz cmpsbsub nCmp,ecx // 总次数减去循环余下次数=循环次数popfdpopad}没错,结果是nCmp=52
2.比较一个字符串和一个字符,找出第一个不同处
__asm{pushadpushfdmov ecx,100 // 要比较的长度mov edi,pDestmov eax,0x10 // 要比较的字符repz scas byte ptr [edi]sub nCmp,ecx // 总次数减去循环余下次数=循环次数popfdpopad}没错,结果是nCmp=52
//-------------------------------------------------------------------
重复前缀指令
任何一个串操作指令,都可以在前面加一个重复前缀,以实现串操作的重复执行,重复次数隐含在CX寄存器中
REP ;REP前缀用在MOVS、STOS、LODS指令前,每次执行一次指令,CX减1;直到CX=0,重复执行结束
REPZ ;也可以表把为REPE,用在CMPS、SCAS指令前,每执行一次串指令CX减1,并判断ZF标志是否为0
;只要CX=0或ZF=0,则重复执行结束
REPNZ ;也可以表达为REPNE,用在CMPS、SCAS指令前,每执行一次串操作指令CX减1,并判断ZF标志是否为1,只要CX=0或ZF=1,则重复执行结束。
1. REP与MOVS或STOS串操作指令相结合使用,完成一组字符的传送或建立一组相同数据的字符串.
2. REPZ/REPE常用与CMPS串操作指令结合使用, 可以完成两组字符串的比较.当串未结束(CX!=0)且当对应串元素相同(ZF=0)时,重复执行字符串指令.它可用来判定两字符串是否相同.
3. REPZ/REPE常与SCAS指令结合使用,可以完成在一个字符串中搜索一个关键字.只要当字符串未结束(CX!=0)且当关键字与元素相同(ZF=0)时,继续重复执行串搜索指令,用于在字符串中查找与关键字不相同的数据的位置
4. REPNZ/REPNE与CMPS指令结合使用,表示当串未结束(CX!=0)且当对应串元素不相同(ZF=1)时,重复执行串比较指令.它可在两字符串中查找相同数据的位置.
5. REPNZ/REPNE与SCAS指令结合使用,表示串未结束(CX!=0)且当关键字与串元素不相同(ZF=1)时,重复执行串搜索指令.它可用来在字符串中查找关键字相同的数据位置.
.串扫描指令SCAS
SCASB ;字节串扫描:AL-ES:[DI],DI←DI+/-1
SCASW ;字串扫描:AX-ES:[DI],DI←DI+/-2
串扫描指令SCAS将附加段中的字节或字内容与AL/AX寄存器内容进行比较,根据比较的结果设置标志,每次比较后修改DI寄存器的值,使之指向下一个元素。
以下是汇编中常出现的代码:
00401099 8d7df8 lea edi,[ebp-8]0040109c 83c9ff or ecx,0FFFFFFFFh0040109f 33c0 xor eax,eax004010a1 f2ae repne scas byte ptr es:[edi]004010a3 f7d1 not ecx004010a5 83c1ff add ecx,0FFFFFFFFh
00401099 8d7df8 lea edi,[ebp-8]:取得字符串地址到edi中,
0:000> db edi0012ff34 44 62 67 00 44 62 67 00-48 ff 12 00 df 10 40 00 Dbg.Dbg.H.....@.
0040109c 83c9ff or ecx,0FFFFFFFFh:把ecx设置为oxffffffff,这样,每次CX-1,cx就不会为0
0040109f 33c0 xor eax,eax:对较的是AL/AX内容,这里把它们设置为0,也就和0比对
那么比对开始:
004010a1 f2ae repne scas byte ptr es:[edi]:即edi所指字符串和al(即为0)对较,
第一次
al比对'D',di=di-1,即byte ptr es:[edi]指向'b',并置相应的标志位
然后cx-1,则ecx=FFFFFFFE,判断是否cx=0或ZF=1,显然该处条件不成立,继续重复执行
第二次
al比对'b',di=di-1,即byte ptr es:[edi]指向'g',并置相应的标志位
然后cx-1,则ecx=FFFFFFFD,判断是否cx=0或ZF=1,显然该处条件不成立,继续重复执行
第三次
al比对'g',di=di-1,即byte ptr es:[edi]指向'0',并置相应的标志位
然后cx-1,则ecx=FFFFFFFC,判断是否cx=0或ZF=1,显然该处条件不成立,继续重复执行
第四次
al比对'g',di=di-1,即byte ptr es:[edi]指向'D',并置相应的标志位
然后cx-1,则ecx=FFFFFFFB,判断是否cx=0或ZF=1,显然该处条件ZF=1成立,结束执行
0:000> r ecx, ediecx=fffffffb edi=0012ff38
0:000> db edi0012ff38 44 62 67 00 48 ff 12 00-df 10 40 00 54 80 40 00 Dbg.H.....@.T.@.004010a3 f7d1 not ecx:ecx求反,1变成0,0变成1,即:
0:000> r ecxecx=00000004004010a5 83c1ff add ecx,0FFFFFFFFh:ecx-1=3为字符串的长度了!
- 5.arm-REPNZ、SCANS、CMPS(比较字符串相关,随手代码)
- 字符串相关操作代码(空格的输入、字符串比较、字符串拷贝、字符串分割、字符串粘着)
- REP/REPE/REPZ/REPNE/REPNZ - 重复字符串操作前缀
- 字符串相关代码
- 【80X86汇编语言学习】【字符串处理】字符串操作指令REPNZ/REPNE
- STM32与ARM启动代码比较分析
- Index Scans
- string类(四、字符串比较相关)
- js日期比较【随手记录】
- Java日期相关随手笔记
- [随手写一个] 字符串实现
- es6 字符串模板 随手记
- ARM相关
- ARM相关
- [原blog文章]字符串比较代码
- C++ 字符串比较 汇编代码实现
- [ARM] Cortex-M Startup.s启动文件相关代码解释
- arm 汇编伪指令与位置相关代码
- Python 脚本语言学习(二)- Hello World
- SWD与JTAG区别及使用情况 [转载]
- c++ string类型转换为char *类型
- Java 理论和实践: 了解泛型
- C#定义定义数组的几种形式
- 5.arm-REPNZ、SCANS、CMPS(比较字符串相关,随手代码)
- OCS 2007R2客户端桌面共享功能开启
- linux设置python环境变量
- 李嘉诚:打工是最愚蠢的投资
- 19个心得 明明白白说Linux下的负载均衡
- 我的目标-engine
- robot framework环境的搭建
- Activity的生命周期
- Android多国语言的国家代码