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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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