String 字符串上的汇编函数

String 字符串上的汇编函数,string,assembly,sequence,String,Assembly,Sequence,我创建了一个函数,它应该返回字符串中相同字符的最高序列的编号。因此,对于字符串“aabbbcaabbccc”,它应该是4,对于“aaaaa”,它应该是5。所以对于“aaaaa”,这个函数应该返回5,实际上它返回2。我盯着它看了很久,但我看不出有错 unsigned long najdlhsia(const char *vstup) { __asm { mov eax, 0 mov ecx, 0 mov ebx, vstup

我创建了一个函数,它应该返回字符串中相同字符的最高序列的编号。因此,对于字符串“aabbbcaabbccc”,它应该是4,对于“aaaaa”,它应该是5。所以对于“aaaaa”,这个函数应该返回5,实际上它返回2。我盯着它看了很久,但我看不出有错

    unsigned long najdlhsia(const char *vstup) {
    __asm {
        mov eax, 0
        mov ecx, 0
        mov ebx, vstup
        cmp [ebx], 0
        je k
        mov edx, [ebx]
        add ebx, 1
        inc eax
        inc ecx
        c: cmp byte ptr[ebx], 0
           je p
           cmp [ebx], edx
           jne a1
           inc ecx
           add ebx, 1
           jmp c
           a1: cmp ecx, eax
               jng a2
               mov eax, ecx
           a2: mov ecx, 1
               mov edx, [ebx]
               add ebx, 1
               jmp c
            p: cmp ecx, eax
               jng k
               mov eax, ecx
        k:
    }
}

int main()
{
    printf("%d", najdlhsia("aaaaa"));
    return 0;
}

“我盯着它看了很长时间,但我看不出有错。”然后,是时候开始使用调试器了。盯着看可以帮助你发现错误,但调试器提供了确凿的事实?只需为当前字符(al)、前一个字符(ah)、当前长度(ecx)、最长(edx)和剩余字符串(esi)设置一个寄存器。每次加载一个字符(al)(而不是解决方案中的4个字符。
cmp[ebx],0
比较dword),然后执行如下操作:循环:{al=byte[esi],esi++,(al==0):{break},(ah!=al):{(ecx>edx):{edx=ecx},ecx=0,ah=al}返回edx;您的代码非常混乱,请使用更好的标签和注释,例如用于每个寄存器。
cmp[ebx],edx
具有32位操作数大小。您同时操作4个连续的
char
s。您需要由Peter Cordes解决的dl
cmp[ebx],谢谢,可以关闭