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;
}
文字列の先頭アドレス(_EDI_)に8を追加し、そのアドレスを_ESI_に入れます。 [ESI]([EDI + 7])の文字はnul(0)のターミネータになります。 1つではなく、_ESI_から2を減算するか? 'sizeofstring'が8ではなく7に設定されます(長さにヌルターミネーターは無視されます)。事実上、最初のループでは 'a'と '\ 0'を比較しますが、それらはもちろん違います。 –
ありがとうございます。それは今働いているようだ。 –
なぜインラインアセンブリを使用してこの作業を行っていますか?アセンブリ言語のプログラミングを学びたい場合、インラインアセンブリは非常に悪いことです。 MASMを実行するようにVisual Studioを設定するだけで、IDEとデバッガを引き続き使用できます。 *あなたがアセンブリを学ぶことを試みていない*場合は、C++でコードを書く方がずっと速く簡単です。 –