程序集x86:基于分隔符拆分字符串

时间:2014-12-13 22:31:50

标签: string assembly split x86 delimiter

目标:采取字符串'一二三'它存储在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

1 个答案:

答案 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]