GetCharPos

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值