Использование команды 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