2016-12-01 9 views
-2

Я застрял на том, как проверить палиндром с помощью MASM.Проверка палиндрома с массивом

#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; 
    } 

Я попросил пользователя ввести строку и вставить ее в массив. Я отправляю его в файл сборки, и он возвращает «1», если его true или «0», если false.

.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++.

заменить

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

по

std::string arr; 

и способ использования строки, чтобы делать то, что вы хотите:

+0

Это не поможет в части сборки. –

+0

@ πάνταῥεῖ Это помощь для части C++. Я позволил другому ответу за часть asm. – Stargateur

0

, поэтому я немного изменил код и заставил его работать.

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; 
} 

то для ассемблерного файла

.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

Преобразование всех буквенных символов в строчные. Если они находятся в верхнем регистре, OR с '0x20'. –

+0

Спасибо за помощь. –

+0

или ch, 32 и или cl, 32 сделали это для меня. –