Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .386
- .MODEL FLAT, STDCALL
- OPTION CASEMAP: NONE
- EXTERN wsprintfA: PROC ; Заголовок функции wsprintfA
- EXTERN ExitProcess@4: PROC ; Функция для завершения процесса
- EXTERN GetStdHandle@4: PROC ; Функция получения хэндла устройства вывода
- INCLUDELIB kernel32.lib ; Подключение библиотеки kernel32.lib
- INCLUDELIB user32.lib ; Подключение библиотеки user32.lib для wsprintfA
- .DATA
- SOURCE DB "Hello, World!", 0
- DEST DB 255 DUP (?)
- NEGATIVE_MSG DB "No palindrome found.", 0
- POSITIVE_MSG DB "Palindrome exists!", 0
- FORMAT DB "Formatted string: %s", 0
- RESULT DB 255 DUP (?)
- .CODE
- ; Определение функции lstrlenA
- lstrlenA PROTO :DWORD
- MAIN PROC
- CLD ; Устанавливаем направление копирования вперед (Clear Direction Flag)
- LEA ESI, SOURCE ; Загружаем адрес исходной строки в регистр ESI
- LEA EDI, DEST + 254 ; Загружаем адрес конечного байта строки назначения в регистр EDI
- MOV ECX, 255 ; Задаем количество байт для копирования
- ; Копируем данные из SOURCE в DEST и инвертируем строку
- REVERSE_LOOP:
- DEC ESI ; Уменьшаем указатель на исходную строку
- MOV AL, [ESI] ; Загружаем байт из исходной строки
- MOV [EDI], AL ; Сохраняем байт в инвертированной строке
- DEC EDI ; Уменьшаем указатель на инвертированную строку
- LOOP REVERSE_LOOP ; Повторяем цикл до достижения ECX = 0
- ; Проверяем совпадение строк
- LEA ESI, SOURCE ; Загружаем адрес исходной строки
- LEA EDI, DEST ; Загружаем адрес инвертированной строки
- MOV ECX, 255 ; Задаем количество байт для сравнения
- ; Сравниваем строки с использованием цикла
- REPE CMPSB
- ; Выводим результат в консоль
- JE IS_PALINDROME ; Переходим к выводу сообщения, если строки совпали
- ; Загружаем указатель на отрицательное сообщение
- LEA EAX, OFFSET NEGATIVE_MSG
- JMP PRINT_MESSAGE ; Переходим к выводу сообщения
- IS_PALINDROME:
- ; Загружаем указатель на положительное сообщение
- LEA EAX, OFFSET POSITIVE_MSG
- PRINT_MESSAGE:
- PUSH OFFSET DEST ; Указатель на буфер для форматирования
- PUSH EAX ; Указатель на сообщение
- CALL wsprintfA ; Форматируем строку
- MOV EDI, OFFSET DEST ; Загружаем адрес отформатированной строки
- CALL lstrlenA ; Получаем длину строки
- ; Получаем хэндл устройства вывода (стандартный вывод)
- PUSH -11
- CALL GetStdHandle@4
- ; Выводим отформатированную строку в консоль
- PUSH EDI ; Указатель на отформатированную строку
- PUSH EAX ; Фактическая длина строки
- PUSH EDI ; Указатель на отформатированную строку
- PUSH EAX ; Максимальная длина строки
- PUSH 0 ; Неформатированный вывод
- PUSH -11 ; Хэндл устройства вывода (стандартный вывод)
- CALL WriteConsoleA@20
- ; Завершаем программу
- PUSH 0
- CALL ExitProcess@4
- MAIN ENDP
- END MAIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement