Использование команды xlat - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброе время суток! Есть задание: перевести в нижний регистр все буквы введеной строки. У меня есть код как это сделать, но выяснилось, что нужно использовать команду XLAT. Может кто помочь советом или (что лучше) кодом. Использую Tasm. Вот работающий код без XLAT.
Листинг программы
  1. .model small
  2. .data
  3. message1 db 13,10,"Enter string: $"
  4. message2 db 13,10,"Result string: $"
  5. crlf db 0Dh,0Ah,'$'
  6. bufferMax db 121;максимальный размер
  7. bufferSize db ?;длина введенной строки
  8. buffer db 121 dup(?);сама строка
  9. .stack 128
  10. .code
  11. assume cs:@code
  12. start:
  13. ; set segment registers:
  14. mov ax, @data
  15. mov ds, ax
  16. mov es, ax
  17. ; - - - -выводим сообщение
  18. mov dx,offset message1
  19. mov ah,9
  20. int 21h
  21. ; - - - -вводим строку
  22. mov dx,offset bufferMax
  23. mov ah,0Ah
  24. int 21h
  25. ; - - - -выводим сообщение
  26. mov dx,offset message2
  27. mov ah,9
  28. int 21h
  29. ; - - - -считываем длину строки
  30. cld
  31. mov si,offset bufferSize
  32. lodsb
  33. mov cl,al
  34. xor ch,ch
  35. ; - - - -дл¤ строковых команд
  36. push si
  37. pop di
  38. ; - - - -цикл замены
  39. control:
  40. lodsb
  41. ; - - - -провер¤ем прописные буквы
  42. cmp al,'A';
  43. jb noChange
  44. cmp al,'Z';
  45. jg noChange
  46. or al,00100000b
  47. jmp short noChange
  48. ; - - - -записываем новый символ
  49. noChange:
  50. stosb
  51. loop control
  52. ; - - - -выводим результат
  53. mov al,'$'
  54. stosb
  55. mov dx,offset buffer
  56. mov ah,09h
  57. int 21h
  58. ; - - - -выход
  59. mov ah,4ch
  60. int 21h
  61. ; - - -
  62. end start

Решение задачи: «Использование команды xlat»

textual
Листинг программы
  1. ; fasm-code
  2. ; кодирует символы по XLAT
  3. ;---------------------------
  4. org  100h
  5. jmp  start
  6.  
  7. mes0    db  13,10,'String: $'
  8. mes1    db  13,10,'Result: $'
  9.  
  10. str1    db  'ABCDEFGHIJKLMNOPQRSTUVWXYZ'  ;набор кодируемых символов
  11. table   db  'abcdefghijklmnopqrstuvwxyz'  ;таблица замены для XLATB
  12. buff    db  80 dup('$')                   ; буфер для строки
  13.  
  14. start:
  15.       mov   ah,9            ; запрос на ввод
  16.       mov   dx,mes0         ;
  17.       int   21h             ;
  18.  
  19.       mov   si,buff         ; адрес буфера для записи
  20. @01:  mov   ah,1            ; ввод с эхом
  21.       int   21h             ;    ..(символ в AL)
  22.       cmp   al,13           ; это Enter ?
  23.       je    exit            ; да//
  24.       mov   dx,25           ; длина таблицы XLAT (отсчёт с нуля)
  25.       mov   di,str1         ; указатель на набор соответствий
  26.       mov   cx,26           ; ..его длина
  27.       repne scasb           ; ищем введённый символы в STR1
  28.       jcxz  next            ; если нет соответствия
  29.       sub   dx,cx           ; иначе: вычисляем позицию найденного символа
  30.       mov   al,dl           ; AL = смещение в таблице XLAT
  31.       mov   bx,table        ; BX = адрес таблицы
  32.       xlatb                 ; кодируем символ!
  33. next: mov   byte[si],al     ; запомним его в буфере
  34.       inc   si              ; смещаемся в буфере
  35.       jmp   @01             ; на повтор..
  36.  
  37. exit: mov   ah,9            ; мессага
  38.       mov   dx,mes1         ;
  39.       int   21h             ;
  40.       mov   dx,buff         ; результат!!!
  41.       int   21h             ;
  42.  
  43.       xor   ax,ax           ;
  44.       int   16h             ;
  45.       int   20h             ; выход в DOS

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


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

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

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы