请教如何修改这段汇编函数?(200)

  • 主题发起人 主题发起人 徐辰仲
  • 开始时间 开始时间

徐辰仲

Unregistered / Unconfirmed
GUEST, unregistred user!
function GetCharPos(ResChar: AnsiChar;Const s: string;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循环的计数器} Test Ecx,Ecx
//看字符串 s是否为''没有一个字符,长度为0 Jz @Exit
cmp ecx,edi //查找开始位置超过字符串长度,退出 Jb @Exit //Mov edi,0
@Compore: cmp al,[edx+edi] //AL中存放字符 jz @Found //相等则说明找到 inc edi
//Edi计数器增加 Loop @Compore //循环比较 @Found: inc Edi //由于Edi从0计数开始,所以加1 Mov Eax,edi //将查找结果传递给函数 返回结果保存在Eax中 ret @Exit: mov Eax,-1;end;上面是网上某位大大写的一个函数用来替代pos函数的,但是小弟在使用中发现GetCharPos('123456',3,5)的返回值居然不是0请教各位大大应该如何修改。[:)]
 
你确定你用GetCharPos('123456',3,5)能调用你上面的函数吗?
 
GetCharPos(chr(51),'123456',5)应该是这样的[:D]写错了[:D]
 
请教哪位懂汇编的大大帮忙看一下GetCharPos(chr(51),'123456',5),这个出来的数字好像是12?为什么不是0呢?谢谢
 
function GetCharPos(ResChar: AnsiChar;Const s: string;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循环的计数器} Test Ecx,Ecx
//看字符串 s是否为''没有一个字符,长度为0 Jz @Exit
cmp ecx,edi //查找开始位置超过字符串长度,退出 Jb @Exit dec edi
sub ecx,edi
@Compore: cmp al,[edx+edi] //AL中存放字符 jz @Found //相等则说明找到 inc edi
//Edi计数器增加 Loop @Compore //循环比较 @Found: inc Edi //由于Edi从0计数开始,所以加1 cmp edi,[edx-4] ja @Exit Mov Eax,edi //将查找结果传递给函数 返回结果保存在Eax中 ret @Exit: mov Eax,-1
retend;
 
前段时间生病了么怎么上,搞定了谢谢wangdonghai大大[:D]
 

Similar threads

S
回复
0
查看
570
swish
S
回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部