1

64 ビット Windows 7 で Visual Studio 2010 を使用して次のコードをコンパイルしようとしました。

#include "stdafx.h"
#include <iostream>
using namespace std;

int strlen2(char str[] )
{
int x ;
    _asm
        {   
            MOV ESI,0;
    LA:     MOV DL,BYTE PTR str[ESI];
            CMP DL,0;
            JE EXIT;
            INC ESI;
            JMP LA;
    EXIT:   MOV x,ESI;

        };

return x;
}

int main()
{
char X[] ="string2222";
cout<<strlen2(X);
system("pause");
return 0;
}

出力は「10Press any key to continue . . .」になると思います
が、残念ながら出力は「3Press any key to continue . . .」でした。X[] の任意の値。
エラーがどこにあるのか説明していただけますか???

4

2 に答える 2

3

文字列ではなく、ポインターの長さを測定しているためです (幸いなことに、上位バイトにゼロがあります)。

代わりにこれを試してください:

        MOV ESI,0;
        MOV EBX, strl
LA:     MOV DL,[ESI + EBX];
        CMP DL,0;
        JE EXIT;
        INC ESI;
        JMP LA;
EXIT:   MOV x,ESI;
于 2012-12-11T12:40:14.817 に答える
1

これをテストする環境はありませんが、アクセスするときに別のレベルの間接化が必要だと思わstrれます

LA:     MOV DL,BYTE PTR str[ESI];

おそらく、ポイント先の文字列ではなく、ポインターの値をスキャンしています。

于 2012-12-11T12:28:05.327 に答える