Advertisement
VladimirKostovsky

2_лаба_херь

Dec 4th, 2023
1,524
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  wsprintfA: PROC     ; Заголовок функции wsprintfA
  6. EXTERN  ExitProcess@4: PROC ; Функция для завершения процесса
  7. EXTERN  GetStdHandle@4: PROC ; Функция получения хэндла устройства вывода
  8.  
  9. INCLUDELIB kernel32.lib   ; Подключение библиотеки kernel32.lib
  10. INCLUDELIB user32.lib     ; Подключение библиотеки user32.lib для wsprintfA
  11.  
  12. .DATA
  13.     SOURCE  DB "Hello, World!", 0
  14.     DEST    DB 255 DUP (?)
  15.     NEGATIVE_MSG DB "No palindrome found.", 0
  16.     POSITIVE_MSG DB "Palindrome exists!", 0
  17.     FORMAT  DB "Formatted string: %s", 0
  18.     RESULT  DB 255 DUP (?)
  19.  
  20. .CODE
  21. ; Определение функции lstrlenA
  22. lstrlenA PROTO :DWORD
  23.  
  24. MAIN PROC
  25.     CLD                     ; Устанавливаем направление копирования вперед (Clear Direction Flag)
  26.     LEA ESI, SOURCE         ; Загружаем адрес исходной строки в регистр ESI
  27.     LEA EDI, DEST + 254     ; Загружаем адрес конечного байта строки назначения в регистр EDI
  28.     MOV ECX, 255            ; Задаем количество байт для копирования
  29.  
  30.     ; Копируем данные из SOURCE в DEST и инвертируем строку
  31.     REVERSE_LOOP:
  32.         DEC ESI             ; Уменьшаем указатель на исходную строку
  33.         MOV AL, [ESI]       ; Загружаем байт из исходной строки
  34.         MOV [EDI], AL       ; Сохраняем байт в инвертированной строке
  35.         DEC EDI             ; Уменьшаем указатель на инвертированную строку
  36.         LOOP REVERSE_LOOP   ; Повторяем цикл до достижения ECX = 0
  37.  
  38.     ; Проверяем совпадение строк
  39.     LEA ESI, SOURCE         ; Загружаем адрес исходной строки
  40.     LEA EDI, DEST           ; Загружаем адрес инвертированной строки
  41.     MOV ECX, 255            ; Задаем количество байт для сравнения
  42.  
  43.     ; Сравниваем строки с использованием цикла
  44.     REPE CMPSB
  45.  
  46.     ; Выводим результат в консоль
  47.     JE IS_PALINDROME        ; Переходим к выводу сообщения, если строки совпали
  48.    ; Загружаем указатель на отрицательное сообщение
  49.     LEA EAX, OFFSET NEGATIVE_MSG
  50.     JMP PRINT_MESSAGE       ; Переходим к выводу сообщения
  51. IS_PALINDROME:
  52.    ; Загружаем указатель на положительное сообщение
  53.     LEA EAX, OFFSET POSITIVE_MSG
  54.  
  55. PRINT_MESSAGE:
  56.     PUSH OFFSET DEST      ; Указатель на буфер для форматирования
  57.     PUSH EAX              ; Указатель на сообщение
  58.     CALL wsprintfA        ; Форматируем строку
  59.     MOV EDI, OFFSET DEST  ; Загружаем адрес отформатированной строки
  60.     CALL lstrlenA         ; Получаем длину строки
  61.  
  62.     ; Получаем хэндл устройства вывода (стандартный вывод)
  63.     PUSH -11
  64.     CALL GetStdHandle@4
  65.  
  66.    ; Выводим отформатированную строку в консоль
  67.     PUSH EDI              ; Указатель на отформатированную строку
  68.     PUSH EAX              ; Фактическая длина строки
  69.     PUSH EDI              ; Указатель на отформатированную строку
  70.     PUSH EAX              ; Максимальная длина строки
  71.     PUSH 0                ; Неформатированный вывод
  72.     PUSH -11              ; Хэндл устройства вывода (стандартный вывод)
  73.     CALL WriteConsoleA@20
  74.  
  75.     ; Завершаем программу
  76.     PUSH 0
  77.     CALL ExitProcess@4
  78.  
  79. MAIN ENDP
  80. END MAIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement