2017-01-07 6 views
0

私は、特定のワードがパリンドロームかどうかをチェックするために、インラインasseblyを使用する単純なプログラムを作成しています。問題は、正しい答えを返さないということです。デバッグ中に私はそこESIレジスタと間違って何か(alの値が)('a'正しいのですが、blでは、それはありません(0)。私は私が間違ってやっているかわからないんだということが分かった。インラインアセンブリ - ワードがパリンドロムかどうかを確認する

#include "stdafx.h" 
#include <iostream> 
#include <string> 
using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char s[] = "arabara"; 
    int sizeofstring = 8; // size of s[] 
    int x = 0; 
    int y = 1; //flag when is_palindrome 
    __asm 
    { 
     lea edi, s 
     mov esi, edi 
     add esi, sizeofstring 
     dec esi //point to the last char 

     mov ecx, sizeofstring 
     cmp ecx, 1 
     je is_palindrome //single char is always a palindrome 

     shr ecx, 1 //divide by 2 

nextchar: 
     mov al, [edi] 
     mov bl, [esi] 
     cmp al, bl 
     jne stop 
     inc edi 
     dec esi 
     loop nextchar 

    is_palindrome: 
    mov eax, y 
    mov x, eax //change flag to 1 

stop: 
    } 

    cout << x << endl; //shoud print 1 when palindrome 
    system("pause"); 
    return 0; 
} 
+1

文字列の先頭アドレス(_EDI_)に8を追加し、そのアドレスを_ESI_に入れます。 [ESI]([EDI + 7])の文字はnul(0)のターミネータになります。 1つではなく、_ESI_から2を減算するか? 'sizeofstring'が8ではなく7に設定されます(長さにヌルターミネーターは無視されます)。事実上、最初のループでは 'a'と '\ 0'を比較しますが、それらはもちろん違います。 –

+0

ありがとうございます。それは今働いているようだ。 –

+0

なぜインラインアセンブリを使用してこの作業を行っていますか?アセンブリ言語のプログラミングを学びたい場合、インラインアセンブリは非常に悪いことです。 MASMを実行するようにVisual Studioを設定するだけで、IDEとデバッガを引き続き使用できます。 *あなたがアセンブリを学ぶことを試みていない*場合は、C++でコードを書く方がずっと速く簡単です。 –

答えて

0

sizeofstringを8に設定しましたが、文字列 "arabara"は7文字の長さです

+0

'' arabara ''は8文字です。終了するヌル文字を忘れないでください – NathanOliver

関連する問題