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_에 넣습니다.이 문자는 문자 하나에 대한 포인터입니다 'EDI + 7'과 같은 ESI에서 1을 빼면 [ESI] ([EDI + 7])의 문자는 nul (0) 종결자가됩니다. _ESI_에서 1을 제외하고 2를 뺍니다. 'sizeofstring'을 8 대신에 7로 설정합니다 (길이의 nul 터미네이터는 무시합니다). 실제로 루프를 처음으로 'a'와 '\ 0'을 비교하면 그들은 물론 다릅니다. –
감사합니다. 지금 일하고있는 것 같습니다. –
인라인 어셈블리를 사용하는 이유는 무엇입니까? 어셈블리 언어 프로그래밍을 배우려고한다면 인라인 어셈블리를 사용하는 것은 매우 나쁜 일입니다. MASM을 실행하도록 Visual Studio를 구성하기 만하면 IDE와 디버거를 계속 사용할 수 있습니다. 어셈블리를 배우려고하지 않는다면 C++로 코드를 작성하는 것이 훨씬 빠르고 간단 해집니다. –