function GetCharPos(ResChar: AnsiChar;const s: AnsiString;Index: integer=0): integer;
asm
//Test指令执行的就是and与操作,唯一不同的是,不保存结果,所以Edx中的值不变
Test edx,edx; // 判断Edx是否为0,如果为0则指针为 nil
jz @Exit //如果为空, 则跳转退出
Mov Edi,Ecx; //保存Index的值,表示从什么地方开始查找
//使用一个增量计数Edi,可以在循环中使用[Edx+Edi]来得到S的每一个字符
mov ecx, [edx-4]; {得到S字符串的长度 Length(s)(因为在delphi的数据存储中String从1开始计数,那么0用来记录字符串的长度,所以 我们移动到前一个地址上则是对应的字符串的长度了),Ecx用来存放字符个数便于使用Loop循环的计数器}
PUSH ECX; //当前字符串长度压栈
Test Ecx,Ecx; //看字符串 s是否为''没有一个字符,长度为0
Jz @Exit;
cmp ecx,edi //查找开始位置超过字符串长度,退出
Jb @Exit
@Compore:
cmp al,[edx+edi] //AL中存放字符
jz @Found //相等则说明找到
inc edi; //Edi计数器增加
Loop @Compore //循环比较
@Found:
inc Edi //由于Edi从0计数开始,所以加1
Pop Eax; //恢复当前字符串长度
TEST EAX,EDI;
JG @END_A; //未找到 输出结果清零
Mov Eax,edi; //将查找结果传递给函数 返回结果保存在Eax中
ret
@Exit: mov Eax,-1;
ret
@END_A: xor EAX,EAX
RET;
end;
asm
//Test指令执行的就是and与操作,唯一不同的是,不保存结果,所以Edx中的值不变
Test edx,edx; // 判断Edx是否为0,如果为0则指针为 nil
jz @Exit //如果为空, 则跳转退出
Mov Edi,Ecx; //保存Index的值,表示从什么地方开始查找
//使用一个增量计数Edi,可以在循环中使用[Edx+Edi]来得到S的每一个字符
mov ecx, [edx-4]; {得到S字符串的长度 Length(s)(因为在delphi的数据存储中String从1开始计数,那么0用来记录字符串的长度,所以 我们移动到前一个地址上则是对应的字符串的长度了),Ecx用来存放字符个数便于使用Loop循环的计数器}
PUSH ECX; //当前字符串长度压栈
Test Ecx,Ecx; //看字符串 s是否为''没有一个字符,长度为0
Jz @Exit;
cmp ecx,edi //查找开始位置超过字符串长度,退出
Jb @Exit
@Compore:
cmp al,[edx+edi] //AL中存放字符
jz @Found //相等则说明找到
inc edi; //Edi计数器增加
Loop @Compore //循环比较
@Found:
inc Edi //由于Edi从0计数开始,所以加1
Pop Eax; //恢复当前字符串长度
TEST EAX,EDI;
JG @END_A; //未找到 输出结果清零
Mov Eax,edi; //将查找结果传递给函数 返回结果保存在Eax中
ret
@Exit: mov Eax,-1;
ret
@END_A: xor EAX,EAX
RET;
end;