在C中使用内联汇编程序计算字符串的大小
我在汇编方面相当差,但我目前有一个使用C的赋值,还有一个使用VS2015 x86本机编译器的内联汇编。我需要计算参数给定的字符串的大小。我的做法如下:在C中使用内联汇编程序计算字符串的大小,c,assembly,inline-assembly,C,Assembly,Inline Assembly,我在汇编方面相当差,但我目前有一个使用C的赋值,还有一个使用VS2015 x86本机编译器的内联汇编。我需要计算参数给定的字符串的大小。我的做法如下: void calculateLength(unsigned char *entry) { int res; __asm { mov esi, 0 strLeng: cmp [entry+ esi], 0 je breakLength
void calculateLength(unsigned char *entry)
{
int res;
__asm {
mov esi, 0
strLeng:
cmp [entry+ esi], 0
je breakLength
inc esi
jmp strLeng
breakLength:
dec esi
mov res, esi
}
printf("%i", res);
}
我的想法是增加esi注册表,直到找到空字符,但每次我得到8作为结果
谢谢你的帮助 我将发布更正后的代码,非常感谢Jester对其进行整理
void calculateLength(unsigned char *entry) {
int res;
__asm {
mov esi, 0
mov ebx, [entry]
strLeng:
cmp [ebx + esi], 0
je breakLength
inc esi
jmp strLeng
breakLength:
mov res, esi
}
printf("%i", res);
}
发生的事情是
cmp[entry+esi],0
正在比较指针值+索引与零,而不是字符串内容。你的问题是什么?我真的不明白为什么我的返回总是8可能是因为你没有在循环内递增eax
?或者可能是因为您在循环中使用了esi
,但没有将其分配给eax
或res
。字符串有多长D注意,您也不需要dec esi
。而且cmp[entry+esi]
可能正在处理指针,而不是指向的字符串。因此,在循环加载项
到寄存器之前,例如mov ebx,[entry]
然后使用cmp[ebx+esi],0
。最好确保使用字节比较,因此cmp byte ptr[ebx+esi],0
。我更改了cmp[entry+esi]
,它成功了。是的,它是在处理指针本身,而不是字符串什么是entrada
?@JL2210可能应该是entry
,但在复制编辑过程中被遗忘了。