Используя команду 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
Объяснение кода листинга программы
- В коде используется ассемблерный язык.
- Код содержит макрос Change, который изменяет символ на другой в заданном диапазоне.
- Код содержит макрос ChangeRange, который изменяет символы в заданном диапазоне.
- Код содержит таблицу XlatTable, которая определяет соответствие между исходными и целевыми символами.
- Код выполняет ввод с клавиатуры с помощью команды int 21h.
- Код выполняет перевод строки с помощью команды int 21h.
- Код использует цикл для обработки каждого символа входной строки.
- Код использует команду xlat для замены символов в соответствии с таблицей XlatTable.
- Код использует команду stosb для записи каждого символа в целевую строку.
- Код добавляет символ доллара в конец целевой строки с помощью команды stosb.
- Код выполняет вывод сообщения с помощью команды int 21h.
- Код выполняет завершение работы программы с помощью команды int 20h.
- Переменная n используется для индексации символов в таблице XlatTable и входной строке.
- Переменная set используется для отслеживания состояния, в котором необходимо изменить символ.
- Переменные ah и dl используются для передачи и получения символов при вводе и выводе.
- Переменные Source и Dest используются для хранения исходной и целевой строк соответственно.
- Переменная bx используется для хранения адреса таблицы XlatTable.
- Переменная si и di используются для указания источника и назначения при переводе строки.
- Команда lodsb используется для загрузки следующего символа из исходной строки в регистр al.
- Команда cmp используется для сравнения символа с символом 13, который представляет символ возврата каретки.
- Команда jz используется для перехода к метке @@Finish, если символ равен символу 13.
- Команда mov используется для перемещения символа в регистр al, который будет записан в целевую строку с помощью команды stosb.
- Команда int 21h используется для выполнения системных функций, таких как ввод и вывод.
- Команда pop используется для восстановления регистра dx после использования команды int 21h для вывода нового сообщения.
- Команда int 20h используется для завершения работы программы.