Загрузка данных


#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;
}