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

String 程序集x86:基于分隔符拆分字符串,string,assembly,split,x86,delimiter,String,Assembly,Split,X86,Delimiter,目标:获取存储在EDI中的字符串“一二三”并调用strtok。 strtok应该拆分字符串,以便ESI指向某个分隔符之后的字符串其余部分,以及分隔符存储在寄存器中之前的字符串第一部分。 使用分隔符“”调用strtok后,结果应为ESI='Two-Three',其他一些寄存器='One' 使用下面的代码,我可以在EDI存储的字符串中找到空间“”的第一个实例的索引。末尾的索引存储在EAX中,定界符定位后字符串的其余部分存储在edi中,然后移动到esi。所以“一二三”ESI变成了“二三”。我的问题是如

目标:获取存储在EDI中的字符串“一二三”并调用strtok。 strtok应该拆分字符串,以便ESI指向某个分隔符之后的字符串其余部分,以及分隔符存储在寄存器中之前的字符串第一部分。 使用分隔符“”调用strtok后,结果应为ESI='Two-Three',其他一些寄存器='One'

使用下面的代码,我可以在EDI存储的字符串中找到空间“”的第一个实例的索引。末尾的索引存储在EAX中,定界符定位后字符串的其余部分存储在edi中,然后移动到esi。所以“一二三”ESI变成了“二三”。我的问题是如何跟踪分隔符之前字符串的第一部分。因此,在本例中,当repne scasb删除字符串的第一部分直到分隔符为止时,如何将“One”存储在寄存器中

    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
只需添加movesi、edi作为strtok例程的第一条指令。最后的xchg esi、edi将给出所需的结果。EDI将指向“一”,ESI将指向“二三”

额外:您可以结合以下说明来获得更好的代码。现在使用LEA似乎有些过分,因为一个简单的MOV就可以做到这一点。 也许改变

Dec Ecx
Lea Eax, [Ecx] ;Set Eax to index of found delimiter
进入

lea eax, [ecx-1]

repne scasb不会删除任何内容,但会增加edi,因此,如果以后需要原始值,而不能从某个位置重新加载,则必须将该值保存在备用寄存器或堆栈临时中。这就是我的问题,我如何在递增时保存这些值并将其放入备用寄存器或临时寄存器?我不确定这是您要问的问题,但在repne scasb指令之前保存edi值只是,比方说,mov edx,edi,然后在您可以使用mov edi,edx还原它之后,或者,如果不执行另一个字符串操作,您可以直接使用保存寄存器值。