2016-12-01 10 views
-2

MASM을 사용하여 palindrome을 확인하는 방법에 대해 고민하고 있습니다.배열을 이용한 Palindrome 검사

#include <iostream> 
#include <cstring> 
#include<string> 
#include <algorithm> 
using namespace std; 

extern "C" 
char test(char*, int); 


int main() 
{ 
char arr[] = {NULL}; 


cout << "Enter a string: " << endl; 
cin >> arr; 



int name = strlen(arr); 
test(arr, name); 
if (name == 1) 
{ 
    cout << "It is a palindrome! " << endl; 

} 
else 
    cout << "Not a palindrome. " << endl; 

return 0; 
    } 

사용자에게 문자열을 물어보고 배열에 삽입했습니다. 어셈블리 파일로 보내면 true이면 '1'을 반환하고 false이면 '0'을 반환합니다.

.686 
.model flat 

.code 


_test PROC ;named _test because C automatically prepends an underscode, it is needed to interoperate 
push ebp 
mov ebp,esp ;stack pointer to ebp 

mov eax,[ebp+8] 
mov ecx,[ebp+12] 
mov ebp,0 
mov edi,0 
mov edx,0 



loopMe: 
cmp ebp,ecx 
je True 

mov al,[eax+edi] 
mov bl,[edx+esi] 
cmp al,bl ;compare 
jne false ;if not equal then jump to false 
inc edi  
dec esi 
jmp loopMe 

True: 
mov eax,1 
jmp allDone 

False: 
mov eax,0 
jmp allDone 


allDone:  
pop ebp 
ret 
_test ENDP 

END 

나는 항상 내가 디버거를 확인하고 항상 값이 동일하더라도 거짓 라벨로 점프 할 0을 반환 보이는 문자열을 입력

. 어떤 도움을 주셔서 감사합니다.

+2

_'cin >> arr;'_ 정의되지 않은 동작입니다. –

+0

C++로 코드를 작성한 다음 [this] (https://gcc.godbolt.org/)와 같은 것을 사용하여 어셈블리 코드의 모양을 결정하십시오. 생성 된 어셈블리가 올바른지, C++ 프로그램이 올바른지 알고 있습니다. 그런 다음 필요한 경우 생성 된 어셈블리 코드를 조정하십시오. – PaulMcKenzie

답변

0

C++의 문자열을 사용하고 있습니다.

std::string arr; 

그리고 문자열의 사용 방법으로

char arr[] = {NULL}; // by the way NULL here has no sence. 

당신이 원하는 것을 할 대체 :

+0

어셈블리 부분에 대해서는별로 도움이되지 않습니다. –

+0

@ πάνταῥεῖ 그것은 C++ 부분에 도움이됩니다. 나는 asm 부분에 대해 다른 대답을했다. – Stargateur

0

그래서 코드를 약간 변경하고 작동하도록했습니다. 는 자사가 아닌 회문을 말할 것 대신 엄마의 I 입력 엄마 경우

int main() 
{ 
char arr[32] = {NULL}; 


cout << "Enter a string: " << endl; 
cin >> arr; 



int name = strlen(arr); 
int palindrome= test(arr, name); 

if (palindrome) 
{ 
    cout << "It is a palindrome! " << endl; 

} 
else 
    cout << "Not a palindrome. " << endl; 

return 0; 
} 

다음 ASM 파일

.686 
.model flat 

.code 


_test PROC ;named _test because C automatically prepends an underscode, it is needed to interoperate 
push ebp 
mov ebp,esp ;stack pointer to ebp 

mov ebx,[ebp+8] 
mov ecx,[ebp+12] 
mov edx,ebx 
add edx,ecx 
dec edx 




loopMe: 
cmp ebx,edx 
jge True 

mov ch,[ebx] 
mov cl,[edx] 
cmp ch,cl ;compare 
jne false ;if not equal then jump to false 
inc ebx  
dec edx 
jmp loopMe 

True: 
mov eax,1 
jmp allDone 

False: 
mov eax,0 
jmp allDone 


allDone:  
pop ebp 
ret 
_test ENDP 

END 

에 대한 내 유일한 문제는 지금이다. 어셈블리에서 사례를 무시하는 방법을 알아야합니다.

+0

모든 영문자를 소문자로 변환하십시오. 그것들이 대문자 범위에 있다면'0x20'과 OR하십시오. –

+0

도움을 주셔서 감사합니다. –

+0

또는 ch, 32 및/또는 cl, 32는 나를 위해 사용했습니다. –