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

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

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

Изучаю Flat Assembler, и возникла проблема. Есть задача, написать программу,которая выводила бы ASCII коды ВСЕХ клавиш, а если прочитанный символ равен 0, то выводила бы расширенный код.
Org 100h
jmp start
 
start:
 
m1: xor ax,ax       ; функция считывания символа с клавиатуры
    int 16h     ; считывание одного символа с клавиатуры (без эха)
    mov ah,01h      ;функция вывода символа на экран, символ уже в AL
    cmp al, 27      ;если HE была нажата клавиша "Esc", то на m1
    
    pushf           ;Сохраняем значения флагов
    call    hexen   ;Вызываем функцию перевода в 16-ое число
    mov al,20h      ;Ставим пробел   
    int 29h         ;Вывод символа на экран в режиме телетайпа
    popf            ;Извлекаем значения флагов        
    jne m1          ; Если zf = 0, продолжаем ожидать ввода, а так же, если не была нажата Esc
hexen:  
    aam 16          ;ASCII коррекция регистра AX после умножения
    push ax       ;Сохраняем значение AX
    
    mov dl, ah    ;Обмениваем значения
    mov ah, al    ;Обмениваем значения
    mov al,dl     ;Обмениваем значени 
    
    call    nibble  ;    
    pop ax       ;Восстанавливаем значение AX
       
nibble: 
    
    and al, 0Fh
    Add Al, 90h       ;Прибавление 90h к содержимому регистра Al
    Daa               ;Десятичная коррекция AL после сложения
    Adc Al, 40h       ;Прибавление 40h к содержимому регистра AL с переносом в CF
    Daa               ;Десятичная коррекция AL после сложения
    int 29h           ;Вывод символа на экран в режиме телетайпа

    ret               ;Возвращаемся в место вызова
 
    int 20h
Как отредактировать данный код для этой задачи?

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

textual
Листинг программы
; Fasm code.........
org 100h
jmp start
 
start: xor   ax,ax                ; клавиша..
       int   16h                  ;
       cmp   al,27                ; esc?
       je    exit                 ;
       or    al,al                ; расширенный?
       jnz   okey                 ;
       xchg  ah,al                ; да - отправляем scan в AL
okey:  call  hexAX                ; выводим на экран в HEX
       mov   al,' '               ; разделитель
       int   29h                  ;
       jmp   start                ; на повтор..
                                  ;
exit:  ret                        ; return dos
 
;------------------------------------------------------------------
; процедура выводит АL на экран в HEX
hexAX:
       shl   ax,8                 ; отправляем AL в AH
       xchg  dx,ax                ; DX = AX
       mov   cx,2                 ; число цифр для вывода
@@:    shld  ax,dx,4              ; получить в AL очередную цифру
       rol   dx,4                 ; удалить ее из DX
       and   al,0Fh               ; оставить в AL только эту цифру
       cmp   al,0Ah               ; три команды, переводящие
       sbb   al,69h               ;    ..шестнадцатеричную цифру в AL
       das                        ;         ..в соответствующий ASCII-код
       int   29h                  ; вывод на экран
       loop  @b                   ; повторить для всех цифр
       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
Похожие ответы