Вывод ASCII кодов символов - Assembler (223794)

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

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

Изучаю Flat Assembler, и возникла проблема. Есть задача, написать программу,которая выводила бы ASCII коды ВСЕХ клавиш, а если прочитанный символ равен 0, то выводила бы расширенный код.
Листинг программы
  1. Org 100h
  2. jmp start
  3. start:
  4. m1: xor ax,ax ; функция считывания символа с клавиатуры
  5. int 16h ; считывание одного символа с клавиатуры (без эха)
  6. mov ah,01h ;функция вывода символа на экран, символ уже в AL
  7. cmp al, 27 ;если HE была нажата клавиша "Esc", то на m1
  8. pushf ;Сохраняем значения флагов
  9. call hexen ;Вызываем функцию перевода в 16-ое число
  10. mov al,20h ;Ставим пробел
  11. int 29h ;Вывод символа на экран в режиме телетайпа
  12. popf ;Извлекаем значения флагов
  13. jne m1 ; Если zf = 0, продолжаем ожидать ввода, а так же, если не была нажата Esc
  14. hexen:
  15. aam 16 ;ASCII коррекция регистра AX после умножения
  16. push ax ;Сохраняем значение AX
  17. mov dl, ah ;Обмениваем значения
  18. mov ah, al ;Обмениваем значения
  19. mov al,dl ;Обмениваем значени
  20. call nibble ;
  21. pop ax ;Восстанавливаем значение AX
  22. nibble:
  23. and al, 0Fh
  24. Add Al, 90h ;Прибавление 90h к содержимому регистра Al
  25. Daa ;Десятичная коррекция AL после сложения
  26. Adc Al, 40h ;Прибавление 40h к содержимому регистра AL с переносом в CF
  27. Daa ;Десятичная коррекция AL после сложения
  28. int 29h ;Вывод символа на экран в режиме телетайпа
  29.  
  30. ret ;Возвращаемся в место вызова
  31. int 20h
Как отредактировать данный код для этой задачи?

Решение задачи: «Вывод ASCII кодов символов»

textual
Листинг программы
  1. ; Fasm code.........
  2. org 100h
  3. jmp start
  4.  
  5. start: xor   ax,ax                ; клавиша..
  6.        int   16h                  ;
  7.        cmp   al,27                ; esc?
  8.        je    exit                 ;
  9.        or    al,al                ; расширенный?
  10.        jnz   okey                 ;
  11.        xchg  ah,al                ; да - отправляем scan в AL
  12. okey:  call  hexAX                ; выводим на экран в HEX
  13.        mov   al,' '               ; разделитель
  14.        int   29h                  ;
  15.        jmp   start                ; на повтор..
  16.                                   ;
  17. exit:  ret                        ; return dos
  18.  
  19. ;------------------------------------------------------------------
  20. ; процедура выводит АL на экран в HEX
  21. hexAX:
  22.        shl   ax,8                 ; отправляем AL в AH
  23.        xchg  dx,ax                ; DX = AX
  24.        mov   cx,2                 ; число цифр для вывода
  25. @@:    shld  ax,dx,4              ; получить в AL очередную цифру
  26.        rol   dx,4                 ; удалить ее из DX
  27.        and   al,0Fh               ; оставить в AL только эту цифру
  28.        cmp   al,0Ah               ; три команды, переводящие
  29.        sbb   al,69h               ;    ..шестнадцатеричную цифру в AL
  30.        das                        ;         ..в соответствующий ASCII-код
  31.        int   29h                  ; вывод на экран
  32.        loop  @b                   ; повторить для всех цифр
  33.        ret

Объяснение кода листинга программы

Список элементов:

  1. Объявление начала кода и точки входа.
  2. Переменная ax инициализируется значением 0.
  3. Проверка на нажатие клавиши Esc.
  4. Если нажата клавиша Esc, выполняется команда exit и возвращается управление DOS.
  5. Переменная al устанавливается в 1, что означает, что символ является расширенным.
  6. Если al не равен 1, то есть это не расширенный символ, выполняется команда okey.
  7. Выполняется команда hexAX, которая выводит шестнадцатеричное значение al в регистре AH.
  8. Переменная al устанавливается в значение пробела.
  9. Выполняется команда int 29h, которая выводит символ на экран.
  10. Команда jmp start переходит к началу цикла.
  11. Процедура hexAX выводит шестнадцатеричное значение al в регистре AH.
  12. Переменная cx инициализируется значением 2, что означает, что будет выведено две цифры.
  13. Цикл начинается с команды shld ax,dx,4, которая получает следующую цифру из регистра DX в регистр AX.
  14. Команда rol dx,4 удаляет только что прочитанную цифру из регистра DX.
  15. Команда and al,0Fh оставляет в регистре AX только текущую цифру.
  16. Команда cmp al,0Ah сравнивает текущую цифру с ASCII-кодом символа tab.
  17. Если текущая цифра равна ASCII-коду символа tab, выполняется команда sbb al,69h, которая заменяет цифру на ASCII-код символа u.
  18. Команда das приводит регистр AH к двоичному представлению.
  19. Выполняется команда int 29h, которая выводит символ на экран.
  20. Цикл повторяется до тех пор, пока все цифры не будут выведены.
  21. Команда ret возвращает управление в вызывающую программу.

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


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

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

8   голосов , оценка 3.875 из 5

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

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

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