Advertisement
VladimirKostovsky

Assembler_lab2_not_exit

Nov 29th, 2023
1,001
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .386
  2. .MODEL FLAT, STDCALL
  3. OPTION CASEMAP: NONE
  4.  
  5. EXTERN  WriteConsoleA@20: PROC ; Функция для вывода строки в консоль
  6. EXTERN  ExitProcess@4: PROC ; Функция для завершения процесса
  7.  
  8. INCLUDELIB kernel32.lib ; Подключение библиотеки kernel32.lib
  9.  
  10. .DATA
  11.     SOURCE  DB "Hello, World!", 0
  12.     DEST    DB 255 DUP (?)
  13.     POSITIVE_MSG DB "Palindrome exists!", 0
  14.     NEGATIVE_MSG DB "No palindrome found.", 0
  15.  
  16. .CODE
  17. ; Определение функции lstrlenA
  18. lstrlenA PROTO :DWORD
  19.  
  20. MAIN PROC
  21.     CLD                     ; Устанавливаем направление копирования вперед (Clear Direction Flag)
  22.     LEA ESI, SOURCE         ; Загружаем адрес исходной строки в регистр ESI
  23.     LEA EDI, DEST + 254     ; Загружаем адрес конечного байта строки назначения в регистр EDI
  24.     MOV ECX, 255            ; Задаем количество байт для копирования
  25.  
  26.     ; Копируем данные из SOURCE в DEST и инвертируем строку
  27.     REVERSE_LOOP:
  28.         DEC ESI             ; Уменьшаем указатель на исходную строку
  29.         MOV AL, [ESI]       ; Загружаем байт из исходной строки
  30.         MOV [EDI], AL       ; Сохраняем байт в инвертированной строке
  31.         DEC EDI             ; Уменьшаем указатель на инвертированную строку
  32.         LOOP REVERSE_LOOP   ; Повторяем цикл до достижения ECX = 0
  33.  
  34.     ; Проверяем совпадение строк
  35.     LEA ESI, SOURCE         ; Загружаем адрес исходной строки
  36.     LEA EDI, DEST           ; Загружаем адрес инвертированной строки
  37.     MOV ECX, 255            ; Задаем количество байт для сравнения
  38.  
  39.     ; Сравниваем строки с использованием цикла
  40.     REPE CMPSB
  41.  
  42.     ; Выводим результат в консоль
  43.     JE IS_PALINDROME        ; Переходим к выводу сообщения, если строки совпали
  44.    ; Загружаем указатель на отрицательное сообщение
  45.     LEA EAX, NEGATIVE_MSG
  46.     JMP PRINT_MESSAGE       ; Переходим к выводу сообщения
  47. IS_PALINDROME:
  48.    ; Загружаем указатель на положительное сообщение
  49.     LEA EAX, POSITIVE_MSG
  50.  
  51. PRINT_MESSAGE:
  52.     PUSH 0
  53.     PUSH EAX              ; Указатель на сообщение
  54.     CALL lstrlenA         ; Получаем длину строки
  55.     PUSH 255              ; Максимальная длина строки
  56.     PUSH EAX              ; Фактическая длина строки
  57.     PUSH EAX              ; Указатель на строку
  58.     PUSH -11              ; Хэндл устройства вывода (стандартный вывод)
  59.     CALL WriteConsoleA@20
  60.  
  61.     ; Завершаем программу
  62.     PUSH 0
  63.     CALL ExitProcess@4
  64.  
  65. MAIN ENDP
  66. END MAIN
  67.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement