Использование команды 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д