您好,登錄后才能下訂單哦!
#include?"pch.h" #include?<iostream> //從別人那里所得頗多,分享自己的所得,如果你有所收獲,那便是再好不過了!水平有限,難免出錯! //編譯環境:vs2017 char?szStr1[]?=?"100001"; char?szStr2[]?=?"100001"; //思路:把字符串逐個字節拿出來,分別比較 bool?myStrcmp(char*?str1,?char*str2) { __asm? { mov?edi,str1???????????????//拷貝str1的地址到edi mov?esi,str2???????????????//拷貝str2的地址到esi mov?ecx,0h????????????????//ecx累加器???? loop1:? mov?al,?byte?ptr[edi?+?ecx]?????//取一個字節傳入al(地址加偏移) mov?bl,?byte?ptr[esi?+?ecx]?????//取一個字節傳入bl(地址加偏移) add?ecx,?1???????????????//ecx+1,取出下一字節 test?al,?al???????????????//判斷al是否為空,字符串的結尾0 jz?fun1?????????????????//為空則跳轉 test?bl,?bl???????????????//判斷bl是否為空,字符串的結尾0 jz?fun1?????????????????//為空則跳轉 cmp?al,bl????????????????//比較al、bl jnz?fun3?????????????????//不相等則跳轉 jmp?loop1????????????????//回到循環頭部 fun1://某個字符串遍歷到結尾0的情況 cmp?al,?bl???//比較al、bl jz?fun2?????//相等則跳轉 jmp?fun3?????//跳轉到fun3 ?? fun2: mov?eax,?1h???//eax置1 jmp?end??????//結束 ? fun3: mov?eax,?0h???//eax置0 end: } } int?main() { bool?bRet=myStrcmp(szStr1,?szStr2); printf("%d",?bRet); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include?"pch.h" #include?<iostream> //編譯環境:vs2017 char?szStr1[100]?=?"100001"; char?szStr2[]?=?"100001156666666666666666666666"; //參數:目的字符串?目的字符串長度?源字符串 void?myStrcpy(char*?str1,int?nStrlen,?char*str2) { //str1會被清空 __asm? { mov?edi,str1????????????????????//拷貝str1的地址到edi mov?esi,str2????????????????????//拷貝str2的地址到esi mov?ecx,?nStrlen????????????????//ecx累加器 cld?????????????????????????????//方向標志位DF置0??esi->edi rep?movsb???????????????????????//rep重復指令??movsb按字節拷貝?esi->edi } } int?main() { myStrcmp(szStr1,100,?szStr2); printf("%s",?szStr1); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include?"pch.h" #include?<iostream> char?szStr1[]?=?"100001"; char?szStr2[]?=?"100001156666666666666666666666"; //思路:從szStrl1末尾開始拷貝,?szStr1l?+?字符串長度?-?1,減去一是去掉末尾0 //參數:目的字符串?目的字符串長度?源字符串?源字符串長度? void?myStrcat(char*?str1,?int?nStrlen1,?char*str2,?int?nStrlen2) { __asm { xor?eax,eax?????????????????????//異或指令,eax清0 add?eax,?str1???????????????????//加上strl起始地址 add?eax,?nStrlen1???????????????//加上字符串長度 sub?eax,1???????????????????????//去掉末尾0 mov?edi,?eax????????????????????//拷貝str1結束的地址到edi mov?esi,?str2???????????????????//拷貝str2的地址到esi mov?ecx,?nStrlen2???????????????//ecx累加器 cld?????????????????????????????//方向標志位DF置0??esi->edi rep?movsb???????????????????????//rep重復指令??movsb按字節拷貝?esi->edi } } int?main() { myStrcat(szStr1,7,szStr2,31); printf("%s",?szStr1); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。