String 字符串上的汇编函数
我创建了一个函数,它应该返回字符串中相同字符的最高序列的编号。因此,对于字符串“aabbbcaabbccc”,它应该是4,对于“aaaaa”,它应该是5。所以对于“aaaaa”,这个函数应该返回5,实际上它返回2。我盯着它看了很久,但我看不出有错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
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解决的dlcmp[ebx],谢谢,可以关闭