Arrays IA 32 AT&;T-如何在没有维度的情况下到达字符数组的末尾?

Arrays IA 32 AT&;T-如何在没有维度的情况下到达字符数组的末尾?,arrays,pointers,assembly,char,arguments,Arrays,Pointers,Assembly,Char,Arguments,我在C语言中有一个函数,用来计算给定字符数组中有多少个“X”。 我收到了参数中的数组,但没有收到它的长度 所以在C中应该是 countX(char ss[]){ int i=0; cont=0; while(ss[i]!='/0'){ if(ss[i]=='X') cont++; i++; } return cont; } } 我必须在ASSEMBLY中实现这一点,但由于我没有数组的长度,我不知道需要在cmp指令中比较什么值才能到达字符数组

我在C语言中有一个函数,用来计算给定字符数组中有多少个“X”。 我收到了参数中的数组,但没有收到它的长度

所以在C中应该是

countX(char ss[]){
   int i=0; cont=0;
   while(ss[i]!='/0'){
      if(ss[i]=='X') cont++;
      i++;
   }
   return cont;
   }
}

我必须在ASSEMBLY中实现这一点,但由于我没有数组的长度,我不知道需要在cmp指令中比较什么值才能到达字符数组的末尾?

此函数称为
strlen
。这是对第一个
0
字节的搜索

仅当数组以终止的
0
字节结尾时,即它是隐式长度的C字符串时,它才起作用

这里没有魔法,只需循环直到找到一个
0
字节

这就是为什么与指针+长度的显式长度字符串相比,
strlen
速度较慢的原因。(不过,
strlen
的Real
libc
实现通过手工编写的asm进行了优化,一次检查16或32个字节。请参阅和)



对于字符串以外的东西,更常见的是向函数传递指针+长度,例如
void foo(float*arr,size\t len)

'/0'
看起来像是打字错误。NUL终止字符应为
'\0'
,也表示结束。假设您正在处理C StringsCharter数组,C中的数组不会自动以“\0”结尾,因此我不确定这是一个好的比较。谢谢您的评论,我注意到它不正确,应该是“\0”。尽管我同意你的观点,但该代码是在课堂练习中给出的,因此无论在何种情况下,我都必须处理它。如果你发布的代码是讲师提供给你的,则需要纠正拼写错误。代码表明数组以NUL(0)终止。您必须扫描值0(字符串的末尾)和字母“X”。@DavidWohlferd如果它们代表字符串,这是一个非常有效的假设。