您好,欢迎来到六九路网。
搜索
您的当前位置:首页汇编REPEREPZ指令,CMPSB指令

汇编REPEREPZ指令,CMPSB指令

来源:六九路网
汇编REPEREPZ指令,CMPSB指令

知识点:

󰀀REPE/REPZ 指令󰀀CMPSB 指令

⼀、CMPSB //cmp //sub

//SCASB//scasw//scasd

cmp byte ptr [edi],al //对标志位的影响相当于sub指令 word,dword

//同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。 //CMPSB

cmps byte ptr [edi],byte ptr [esi]//对标志位的影响相当于sub指令 cmps word ptr //cmpsw cmps dword ptr //cmpsd

//同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。

⼆、REPE/REPZ 指令

//上⼀节课我们了解了REPNE/REPNZ

REPNE SCAS BYTE PTR ES:[EDI] // 当ECX!=0并且ZF==0时 重复执⾏后边的指令 每执⾏⼀次ECX的值减1 REPE/REPZ cmpsb //// 当ECX!=0并且ZF=1时 重复执⾏后边的指令 每执⾏⼀次ECX的值减1

三、代码测试

1、⽐较字符串是否相等

MOV EDI,s1 MOV ESI,s2

MOV ECX,0xFFFFFFFF

XOR EAX,EAX //查找字串结束标志 '\\0' eax=0 REPNE SCASB // edi,al

NOT ECX //计算字串长度存ECX MOV EDI,s1 mov ESI,s2 XOR EDX,EDX

REPE CMPSB //不相等则退出

int _tmain(int argc, _TCHAR* argv[]){

char *s1=\"abcde21\"; char *s2=\"abcde1\"; __asm {

//mov al,0

xor al,al//eax=0 mov edi,s1//

mov ecx,-1 //0xFFFF FFFF repnz scasb;

not ecx // '\\0' 计算s1字串长度,指定repz循环次数 mov edi,s1 mov esi,s2

repz cmpsb // edi,esi

//ZF=1 && ECX=0 字串相等 }

return 0;}

知识点:

󰀀__declspec(naked) 纯汇编󰀀堆栈平衡󰀀参数传递

󰀀⽤纯汇编封装函数strcmpA

⼀、CMPSB //cmp //sub

//SCASB//scasw//scasd

cmp byte ptr [edi],al //对标志位的影响相当于sub指令 word,dword

//同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。 //CMPSB

cmps byte ptr [edi],byte ptr [esi]//对标志位的影响相当于sub指令 cmps word ptr //cmpsw cmps dword ptr //cmpsd

//同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。

⼆、REPE/REPZ 指令

//上⼀节课我们了解了REPNE/REPNZ

REPNE SCAS BYTE PTR ES:[EDI] // 当ECX!=0并且ZF==0时 重复执⾏后边的指令 每执⾏⼀次ECX的值减1 REPE/REPZ cmpsb //// 当ECX!=0并且ZF=1时 重复执⾏后边的指令 每执⾏⼀次ECX的值减1

三、代码测试

1、⽐较字符串是否相等

int _tmain(int argc, _TCHAR* argv[]){

char *s1=\"abcde21\"; char *s2=\"abcde1\"; __asm {

//mov al,0

xor al,al//eax=0 mov edi,s1//

mov ecx,-1 //0xFFFF FFFF repnz scasb;

not ecx // '\\0' 计算s1字串长度,指定repz循环次数 mov edi,s1 mov esi,s2

repz cmpsb // edi,esi

//ZF=1 && ECX=0 字串相等 }

return 0;}

__declspec(naked) int strcmpA(char* s1,char *s2)// scasw strcmpW{

__asm {

push ebp // esp+4+4 s1 //esp+4+8 mov ebp,esp //构建栈底 //mov al,0

xor al,al//eax=0

mov edi,[ebp+4+4]//

mov ecx,-1 //0xFFFF FFFF repnz scasb;

not ecx // '\\0' 计算s1字串长度,指定repz循环次数 mov edi,[ebp+4+4] mov esi,[ebp+4+8] repz cmpsb // edi,esi //[edi-1] [esi-1]

xor eax,eax xor edx,edx mov al,[edi-1] mov dl,[esi-1]

sub eax,edx //相等eax=0,⼤于返回结果>0 ⼩于<0 pop ebp //栈平衡 retn }}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务