Я пишу простую программу, которая использует inline-асинхронно, чтобы проверить, является ли данное слово палиндром. Проблема в том, что он не возвращает правильных ответов. Во время отладки я обнаружил, что там что-то не так с ЭРИ регистра (значение в al
правильно ('a'
), но в bl
это не (0). Я не уверен, что я делаю неправильно.встроенная сборка - проверьте, является ли слово палиндром
#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;
}
Вы первоначально добавили 8 к стартовому адресу (_EDI_) строки и поместили этот адрес в _ESI_. Это указатель на символ один минус терминатор nul (0). Вы вычитаете 1 из ESI, который совпадает с [EDI + 7]. Затем символ в [ESI] ([EDI + 7]) является терминатором nul (0). Возможно, вы имели в виду вычесть 2 из _ESI_, а не только один? было бы установлено 'sizeofstring' равным 7 вместо 8 (игнорируя nul terminator по длине). Фактически, первый раз через вашу петлю вы сравниваете «a» с «\ 0», и они, разумеется, разные. –
Спасибо. Кажется, сейчас он работает. –
Почему вы делаете это с помощью встроенной сборки? Если вы пытаетесь изучить программирование на ассемблере, тогда встроенная сборка - очень плохая вещь для использования. Просто настройте Visual Studio на выполнение MASM, и вы можете продолжать использовать IDE и отладчик. Если вы * не * пытаетесь изучить сборку, тогда было бы намного быстрее и проще писать код на C++. –