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;
}
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. –
Danke. Es scheint jetzt zu funktionieren. –
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. –