Использование команды xlat - Assembler
Формулировка задачи:
Доброе время суток!
Есть задание: перевести в нижний регистр все буквы введеной строки.
У меня есть код как это сделать, но выяснилось, что нужно использовать команду XLAT.
Может кто помочь советом или (что лучше) кодом. Использую Tasm.
Вот работающий код без XLAT.
.model small .data message1 db 13,10,"Enter string: $" message2 db 13,10,"Result string: $" crlf db 0Dh,0Ah,'$' bufferMax db 121;максимальный размер bufferSize db ?;длина введенной строки buffer db 121 dup(?);сама строка .stack 128 .code assume cs:@code start: ; set segment registers: mov ax, @data mov ds, ax mov es, ax ; - - - -выводим сообщение mov dx,offset message1 mov ah,9 int 21h ; - - - -вводим строку mov dx,offset bufferMax mov ah,0Ah int 21h ; - - - -выводим сообщение mov dx,offset message2 mov ah,9 int 21h ; - - - -считываем длину строки cld mov si,offset bufferSize lodsb mov cl,al xor ch,ch ; - - - -дл¤ строковых команд push si pop di ; - - - -цикл замены control: lodsb ; - - - -провер¤ем прописные буквы cmp al,'A'; jb noChange cmp al,'Z'; jg noChange or al,00100000b jmp short noChange ; - - - -записываем новый символ noChange: stosb loop control ; - - - -выводим результат mov al,'$' stosb mov dx,offset buffer mov ah,09h int 21h ; - - - -выход mov ah,4ch int 21h ; - - - end start
Решение задачи: «Использование команды xlat»
textual
Листинг программы
; fasm-code ; кодирует символы по XLAT ;--------------------------- org 100h jmp start mes0 db 13,10,'String: $' mes1 db 13,10,'Result: $' str1 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;набор кодируемых символов table db 'abcdefghijklmnopqrstuvwxyz' ;таблица замены для XLATB buff db 80 dup('$') ; буфер для строки start: mov ah,9 ; запрос на ввод mov dx,mes0 ; int 21h ; mov si,buff ; адрес буфера для записи @01: mov ah,1 ; ввод с эхом int 21h ; ..(символ в AL) cmp al,13 ; это Enter ? je exit ; да// mov dx,25 ; длина таблицы XLAT (отсчёт с нуля) mov di,str1 ; указатель на набор соответствий mov cx,26 ; ..его длина repne scasb ; ищем введённый символы в STR1 jcxz next ; если нет соответствия sub dx,cx ; иначе: вычисляем позицию найденного символа mov al,dl ; AL = смещение в таблице XLAT mov bx,table ; BX = адрес таблицы xlatb ; кодируем символ! next: mov byte[si],al ; запомним его в буфере inc si ; смещаемся в буфере jmp @01 ; на повтор.. exit: mov ah,9 ; мессага mov dx,mes1 ; int 21h ; mov dx,buff ; результат!!! int 21h ; xor ax,ax ; int 16h ; int 20h ; выход в DOS
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д