目标:采取字符串'一二三'它存储在EDI中并调用strtok。 strtok应该拆分字符串,以便在分隔符之后ESI指向字符串的其余部分,并且在分隔符之前将字符串的第一部分存储在寄存器中。 在调用strtok之后使用'的分隔符'结果应该是ESI =' Two Three'和其他一些注册='一个'
使用下面的代码,我可以找到空间的第一个实例的索引' '在EDI中存储的字符串中。最后的索引存储在EAX中,分隔符所在的字符串的其余部分存储在edi中,然后移动到esi。所以'一二三' ESI成为“二三”。我的问题是如何在分隔符之前跟踪字符串的第一部分。所以在这个例子中我如何存储' One'在寄存器中看起来像repne scasb删除字符串的第一部分直到分隔符。
strtok:
Mov Ecx, 0 ;reset ecx to 0
Not Ecx ;set Ecx to -1 or highest possible integer
Mov Al, ' ' ;Initialize a1 to delimiter of (space) ' '
Cld ;Clear Direction Pointer
Repne Scasb ;scan edi one byte at a time until delimiter found
Not Ecx
Dec Ecx
Lea Eax, [Ecx] ;Set Eax to index of found delimiter
Xchg Esi, Edi ;Take Edi which is now equal to string after found delimiter and put in esi
答案 0 :(得分:0)
只需添加mov esi,edi
作为 strtok 例程的第一条指令。最后的xchg esi,edi
将给出所需的结果。 EDI将指向“One' ESI将指向“二三”
额外:您可以结合以下说明来获得更好的代码。现在使用LEA似乎有点过头了,因为一个简单的MOV可以解决这个问题 也许改变
Dec Ecx
Lea Eax, [Ecx] ;Set Eax to index of found delimiter
进入
lea eax, [ecx-1]