#include <iostream>
using namespace std;
// Функция проверки на палиндром (возвращает 1 – да, 0 – нет)
int isPalindrome(const char* str) {
int result = 0; // переменная для результата
__asm {
// ---------- 1. Поиск длины строки ----------
mov esi, str ; ESI = указатель на начало строки
xor ecx, ecx ; ECX = 0 (счётчик длины)
mov edi, esi ; EDI тоже указывает на начало (понадобится позже)
find_len:
lodsb ; AL = *ESI, ESI++ (загружаем байт и двигаем указатель)
test al, al ; проверяем, не конец ли строки (AL == 0)
jz found_end ; если да – выходим из цикла
inc ecx ; иначе увеличиваем длину на 1
jmp find_len ; повторяем
found_end:
// ---------- 2. Установка указателей ----------
mov esi, str ; ESI снова указывает на начало строки
mov edi, esi ; EDI = начало строки
add edi, ecx ; EDI = начало + длина (теперь указывает на нуль-терминатор)
dec edi ; EDI = начало + длина - 1 (последний символ строки)
// ---------- 3. Сравнение символов с двух концов ----------
compare_loop:
cmp esi, edi ; сравниваем левый и правый указатели
jge palindrome ; если левый >= правого – все символы проверены, это палиндром
mov al, [esi] ; AL = символ слева
mov bl, [edi] ; BL = символ справа
cmp al, bl ; сравниваем символы
jne not_palindrome ; если не равны – это не палиндром
inc esi ; двигаем левый указатель вправо
dec edi ; двигаем правый указатель влево
jmp compare_loop ; продолжаем
// ---------- 4. Запись результата ----------
palindrome:
mov result, 1 ; строка – палиндром
jmp done
not_palindrome:
mov result, 0 ; строка – не палиндром
done:
nop ; точка останова (необязательно)
}
return result;
}
// Пример использования
int main() {
const char* test1 = "racecar";
const char* test2 = "hello";
const char* test3 = "a";
const char* test4 = "";
cout << "\"" << test1 << "\" -> " << (isPalindrome(test1) ? "палиндром" : "не палиндром") << endl;
cout << "\"" << test2 << "\" -> " << (isPalindrome(test2) ? "палиндром" : "не палиндром") << endl;
cout << "\"" << test3 << "\" -> " << (isPalindrome(test3) ? "палиндром" : "не палиндром") << endl;
cout << "\"" << test4 << "\" -> " << (isPalindrome(test4) ? "палиндром" : "не палиндром") << endl;
return 0;
}