本文目的
利用REPNZ SCASB指令 以及 REPE CMPSB指令来写一个字符串比较函数
本文概要
1.REPNZ SCASB指令介绍
2.REPE CMPSB指令介绍
3.字符串比较函数编写
一、REPNZ SCASB指令介绍

这两个指令组合起来就是用来寻找字符串中的字符的
值得一说的是 SCASB SCASW SCASD是一个系列的指令,只是操作数的字节数变了
二、REPE CMPSB指令介绍

简而言之这两个指令就是用 edi 和 esi 指向两个字符串,然后一个字节一个字节的比较,如果不相同(ZF = 0)则跳出
三、字符串比较函数编写
#include<cstdio>
__declspec(naked) int asm_strcmpA(char* s1,char* s2) // 告诉编译器不用帮忙做堆栈平衡,因为我们要传递参数出去,所以自己来做
{
__asm{
/*1、先用ecx算出字符串s1的长度
2、再来进行比较*/
push ebp
mov ebp,esp
push ecx
push esi
push edi
xor al,al ;al = 0,字符串结束就是0
mov ecx,-1 ;ecx = FFFFFFFF
mov edi,s1 ;edi = s1
repne scasb ;[edi]与 al相比较 不等就重复比较 ecx-- edi++
not ecx ;ecx = s1的长度加1
mov edi,s1;edi = s1
mov esi,s2;esi = s2
repe cmpsb ;[edi]与[esi]相比较 不等就跳出 相等就重复比较 ecx-- edi/esi++
xor al,al
mov al,[edi-1]
sub al,[esi-1] ;取最后一个不同的字符相比较,结果存在al中,作为返回值
pop edi
pop esi
pop ecx
pop ebp
retn
}
}
int main()
{
printf("asm_strcmpA\n");
printf("%d\n",asm_strcmpA("abcd","abcd"));
getchar();
return 0;
}
网友评论