2017-01-07 8 views
0

Ich schreibe ein einfaches Programm, das Inline Assemble verwendet, um zu überprüfen, ob das angegebene Wort ein Palindrom ist. Das Problem ist, dass es keine richtigen Antworten liefert. Während das Debuggen fand ich heraus, dass etwas nicht stimmt mit esi Register gibt es (der Wert in al korrekt ist ('a'), aber in bl ist es nicht (0). Ich bin nicht sicher, was ich falsch mache.Inline-Assembly - Überprüfen Sie, ob das Wort ein Palindrom ist

#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

Sie ursprünglich 8 an die Startadresse (_EDI_) der Zeichenfolge hinzufügen und diese Adresse in _ESI_. Das ist ein Zeiger auf das Zeichen eins Nach dem Nul (0) -Terminator subtrahieren Sie 1 von ESI, was dasselbe ist wie [EDI + 7] Das Zeichen bei [ESI] ([EDI + 7]) ist dann der Null (0) -Terminator subtrahiere 2 von _ESI_ und nicht nur eine? Die Alternative würde "sizeofstring" auf 7 statt auf 8 setzen (ignoriere den Nullterminator in der Länge). In der Tat vergleichen Sie das erste Mal durch Ihre Schleife 'a' mit '\ 0' und sie sind natürlich anders. –

+0

Danke. Es scheint jetzt zu funktionieren. –

+0

Warum machst du das inline Assembly? Wenn Sie versuchen, Assembler-Programmierung zu lernen, dann ist Inline-Assembly eine sehr schlechte Sache zu verwenden. Konfigurieren Sie Visual Studio einfach so, dass MASM ausgeführt wird, und Sie können weiterhin IDE und Debugger verwenden. Wenn Sie * nicht versuchen, Assembly zu lernen, wäre es viel schneller und einfacher, den Code in C++ zu schreiben. –

Antwort

0

Sie setzen sizeofstring auf 8, aber Ihre Zeichenfolge "arabara" ist sieben Zeichen lang.

+0

'" arabara "' ist 8 Zeichen lang. Vergessen Sie nicht das abschließende Nullzeichen – NathanOliver

Verwandte Themen