在C中使用内联汇编程序计算字符串的大小

在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

我在汇编方面相当差,但我目前有一个使用C的赋值,还有一个使用VS2015 x86本机编译器的内联汇编。我需要计算参数给定的字符串的大小。我的做法如下:

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
,但在复制编辑过程中被遗忘了。