日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

汇编 REPE/REPZ 指令,CMPSB指令

發布時間:2024/1/3 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 汇编 REPE/REPZ 指令,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 //查找字串結束標志 ''  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 // '' 計算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 // '' 計算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 // '' 計算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
	}
}

總結

以上是生活随笔為你收集整理的汇编 REPE/REPZ 指令,CMPSB指令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。