2017-01-07 4 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_에 넣습니다.이 문자는 문자 하나에 대한 포인터입니다 'EDI + 7'과 같은 ESI에서 1을 빼면 [ESI] ([EDI + 7])의 문자는 nul (0) 종결자가됩니다. _ESI_에서 1을 제외하고 2를 뺍니다. 'sizeofstring'을 8 대신에 7로 설정합니다 (길이의 nul 터미네이터는 무시합니다). 실제로 루프를 처음으로 'a'와 '\ 0'을 비교하면 그들은 물론 다릅니다. –

+0

감사합니다. 지금 일하고있는 것 같습니다. –

+0

인라인 어셈블리를 사용하는 이유는 무엇입니까? 어셈블리 언어 프로그래밍을 배우려고한다면 인라인 어셈블리를 사용하는 것은 매우 나쁜 일입니다. MASM을 실행하도록 Visual Studio를 구성하기 만하면 IDE와 디버거를 계속 사용할 수 있습니다. 어셈블리를 배우려고하지 않는다면 C++로 코드를 작성하는 것이 훨씬 빠르고 간단 해집니다. –

답변

0

sizeofstring을 8로 설정했지만 문자열 "arabara"는 7 자 길이

+0

''arabara ''는 8 자입니다. 끝 null 문자를 잊지 마라. – NathanOliver