GetCharPos
来源:互联网 发布:阿里云 商标注册 编辑:程序博客网 时间:2024/06/10 17:01
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;
0 0
- GetCharPos
- php本地包含
- innodb_flush_log_at_trx_commit和sync_binlog参数详解
- [重写开源框架源码]SwipeBackLayout实现全屏滑动
- 蓝桥杯 算法训练 未名湖边的烦恼
- 发现一个好东西
- GetCharPos
- 自主研发异步通信框架Minma(支持长连接和短连接)
- 宏定义
- zzulioj--1712--Monty Hall problem(蒙提霍尔问题)
- Direct3d & opengl & 3d max的配置和使用
- failed to resolve com.android.support:appcompat-v7:23+ 解决方法
- 最大流学习笔记
- 通过SQL Server 2008数据库复制实现数据库同步备份
- nyoj--514--1的个数(贪心)