2017-01-07 1 views
0

J'écris un programme simple qui utilise inline de manière à vérifier si le mot donné est un palindrome. Le problème est qu'il ne renvoie pas les bonnes réponses. Au cours de débogage j'ai découvert qu'il ya quelque chose de mal avec le registre esi (la valeur al est correcte ('a'), mais bl ce n'est pas (0). Je ne suis pas sûr de ce que je fais mal.assemblage en ligne - vérifier si le mot est un palindrome

#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

Vous ajoutez à l'origine 8 à l'adresse de début (_EDI_) de la chaîne et mettez cette adresse dans _ESI_, c'est-à-dire un pointeur sur le caractère après le terminateur nul (0) Vous soustrayez 1 à ESI qui est le même que [EDI + 7] Le caractère à [ESI] ([EDI + 7]) est alors le terminateur nul (0). soustraire 2 de _ESI_ et pas seulement un? L'alternative serait réglé 'sizeofstring' à 7 au lieu de 8 (en ignorant le terminateur nul dans la longueur). En effet, la première fois que vous parcourez votre boucle, vous comparez «a» avec «\ 0» et ils sont différents bien sûr. –

+0

Merci. Cela semble fonctionner maintenant. –

+0

Pourquoi faites-vous cela en utilisant l'assemblage en ligne? Si vous essayez d'apprendre la programmation en langage assembleur, alors l'assemblage en ligne est une très mauvaise chose à utiliser. Configurez simplement Visual Studio pour exécuter MASM et vous pouvez continuer à utiliser l'IDE et le débogueur. Si vous * n'essayez pas d'apprendre l'assemblage, il serait beaucoup plus rapide et plus simple d'écrire le code en C++. –

Répondre

0

Vous définissez sizeofstring sur 8, mais votre chaîne "arabara" est composée de sept caractères

+0

'" arabara "' a 8 caractères. Ne pas oublier le caractère nul final – NathanOliver