Используя команду XLAT восстановить ошибку раскладки клавиатуры - Assembler

Узнай цену своей работы

Формулировка задачи:

Используя команду XLAT восстановить ошибку раскладки клавиатуры ("аналог" программы Punto Switcher), результат вывести на экран. Например, введена строка hjph vbhf, вывести на экран саму строку hjpf vbhf и "восстановленную" строку роза мира.

Решение задачи: «Используя команду XLAT восстановить ошибку раскладки клавиатуры»

textual
Листинг программы
.model tiny
.data
 
Change          macro   from, to
        if      (n eq from) and (set eq 0)
                db      to
          set = 1
        endif
endm
 
ChangeRange     macro   first, last, to
        if      (n ge first) and (n le last)
          if    n eq first
                db      to
          endif
          set = 1
        endif
endm
 
XlatTable:
n = 0
rept            256
                set = 0
                ChangeRange 'A', 'Z', 'ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ'
                ChangeRange 'a', 'z', 'фисвуапршолдьтщзйкыегмцчня'
                ChangeRange 'А', 'п', 'F<DULT:PBQRKVYJGHCNEA{WXIO}SM">Zf,dult;pbqrkvyjg'
                ChangeRange 'р', 'я', "hcnea[wxio]sm'.z"
                Change  'Ё', '~'
                Change  'ё', '`'
                Change  '~', 'Ё'
                Change  '`', 'ё'
                Change  '{', 'Х'
                Change  '[', 'х'
                Change  '}', 'Ъ'
                Change  ']', 'ъ'
                Change  ':', 'Ж'
                Change  ';', 'ж'
                Change  '"', 'Э'
                Change  "'", 'э'
                Change  '<', 'Б'
                Change  ',', 'б'
                Change  '>', 'Ю'
                Change  '.', 'ю'
                Change  '|', '/'
                Change  '/', '.'
                Change  '?', ','
                Change  '@', '"'
                Change  '#', '№'
                Change  '$', ';'
                Change  '^', ':'
                Change  '&', '?'
                Change  '"', '@'
                Change  '№', '#'
                Change  '?', '&'
        ife     set
                db      n
        endif
                n = n+1
endm
 
Input           db      79,?
Source          db      79 dup (?)
Dest:
 
.code
.startup
 
                cld
                mov     ah,0Ah
                lea     dx,Input
                int     21h             ; ввода
                mov     ah,2
                mov     dl,10
                int     21h             ; новая строка
 
                ; перевод
                lea     si,Source
                lea     di,Dest
                push    di
                lea     bx,XlatTable
        @@Next: lodsb
                cmp     al,13
                jz      @@Finish
                xlat
                stosb
                jmp     @@Next
        @@Finish:
                mov     al,'$'
                stosb                   ; запись доллара (конца строки)
 
                mov     ah,9
                pop     dx
                int     21h             ; вывод нового сообщения
 
                int     20h
 
end

Объяснение кода листинга программы

  1. В коде используется ассемблерный язык.
  2. Код содержит макрос Change, который изменяет символ на другой в заданном диапазоне.
  3. Код содержит макрос ChangeRange, который изменяет символы в заданном диапазоне.
  4. Код содержит таблицу XlatTable, которая определяет соответствие между исходными и целевыми символами.
  5. Код выполняет ввод с клавиатуры с помощью команды int 21h.
  6. Код выполняет перевод строки с помощью команды int 21h.
  7. Код использует цикл для обработки каждого символа входной строки.
  8. Код использует команду xlat для замены символов в соответствии с таблицей XlatTable.
  9. Код использует команду stosb для записи каждого символа в целевую строку.
  10. Код добавляет символ доллара в конец целевой строки с помощью команды stosb.
  11. Код выполняет вывод сообщения с помощью команды int 21h.
  12. Код выполняет завершение работы программы с помощью команды int 20h.
  13. Переменная n используется для индексации символов в таблице XlatTable и входной строке.
  14. Переменная set используется для отслеживания состояния, в котором необходимо изменить символ.
  15. Переменные ah и dl используются для передачи и получения символов при вводе и выводе.
  16. Переменные Source и Dest используются для хранения исходной и целевой строк соответственно.
  17. Переменная bx используется для хранения адреса таблицы XlatTable.
  18. Переменная si и di используются для указания источника и назначения при переводе строки.
  19. Команда lodsb используется для загрузки следующего символа из исходной строки в регистр al.
  20. Команда cmp используется для сравнения символа с символом 13, который представляет символ возврата каретки.
  21. Команда jz используется для перехода к метке @@Finish, если символ равен символу 13.
  22. Команда mov используется для перемещения символа в регистр al, который будет записан в целевую строку с помощью команды stosb.
  23. Команда int 21h используется для выполнения системных функций, таких как ввод и вывод.
  24. Команда pop используется для восстановления регистра dx после использования команды int 21h для вывода нового сообщения.
  25. Команда int 20h используется для завершения работы программы.

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы