Ввести число в 16-ричном виде, вывести соответствующий ASCII символ - Assembler

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

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

Добрый день. Помогите с заданием по ассемблеру. Завтра сдача. Не сдаст мой знакомый - отчислят. Сам я плохо в нем разбираюсь. Свое задание еле смог решить. Заранее спасибо. Ввести число в 16-ричном виде {пример для H}. Вывести соответствующий по таблице ASCII символ

Решение задачи: «Ввести число в 16-ричном виде, вывести соответствующий ASCII символ»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        CrLf    db      0Dh, 0Ah, '$'
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        mov     cx,     2
@@GetChar:
        mov     ah,     08h
        int     21h
        ;запоминаем введённый символ, для дальнейшего вывода на экран
        mov     dl,     al
        ;фильтрация ввода
        ; - это цифра?
        cmp     al,     '0'
        jb      @@GetChar
        cmp     al,     '9'
        jbe     @@CalcDigit
        ; - это буква от 'A' до 'F'?
        cmp     al,     'A'
        jb      @@GetChar
        cmp     al,     'F'
        jbe     @@CalcChar
        ; - это буква от 'a' до 'f'
        cmp     al,     'a'
        jb      @@GetChar
        cmp     al,     'f'
        ja      @@GetChar
        ; преобразовать маленькую букву к большой
        sub     al,     'a'-'A'
@@CalcChar:
        ;преобразовать большую букву к цифре от 10
        sub     al,     'A'-'0'-0Ah
@@CalcDigit:
        ;преобразовать символ цифры к числу
        sub     al,     '0'
        ;умножить результирующее число на 16
        shl     bl,     1
        shl     bl,     1
        shl     bl,     1
        shl     bl,     1
        ;добавить к нему новую цифру
        or      bl,     al
 
        ;показать введённый символ
        mov     ah,     02h
        int     21h
 
        loop    @@GetChar
 
        ;вывести пробел
        mov     ah,     02h
        mov     dl,     ' '
        int     21h
 
        ;вывести ASCII символ введённого кода
        mov     ah,     02h
        mov     dl,     bl
        int     21h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

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

  1. Объявление переменных:
    • CrLf: переменная типа db (байт), содержащая символы новой строки (0Dh - перенос каретки, 0Ah - перевод строки, $ - означает конец строки)
  2. Организация кода:
    • Объявление модели программы (.model small) и размера стека (.stack 100h)
  3. Организация сегментов данных и кода:
    • Объявление сегмента данных (.data) и сегмента кода (.code)
  4. Основная программа:
    • Объявление начала процедуры main
  5. Установка значения регистра DS:
    • Загрузка адреса сегмента данных в регистр AX
    • Загрузка значения регистра AX в регистр DS
  6. Цикл ввода символа:
    • Установка значения 2 в регистр CX (количество символов для ввода)
    • Метка @@GetChar для цикла
    • Ввод символа с помощью прерывания 21h с функцией 08h
    • Сохранение введенного символа в регистр DL
    • Проверка, является ли введенный символ цифрой ('0'-'9'), буквой от 'A' до 'F' или от 'a' до 'f'
    • Если введенный символ не соответствует условиям, происходит возврат к метке @@GetChar
    • Преобразование введенной буквы к заглавной, если она находится в диапазоне от 'a' до 'f'
    • Преобразование введенной буквы или цифры к числу
    • Умножение результата на 16 и добавление новой цифры
    • Вывод введенного символа на экран с помощью прерывания 21h и функции 02h
    • Уменьшение значения регистра CX на 1 с помощью инструкции loop @@GetChar для продолжения цикла
    • Вывод пробела на экран с помощью прерывания 21h и функции 02h
    • Вывод ASCII символа введенного кода с помощью прерывания 21h и функции 02h
    • Завершение программы с помощью прерывания 21h и функции 4Ch
  7. Завершение процедуры main
  8. Завершение программы end main

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

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