Ввести число в 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
Объяснение кода листинга программы
- Объявление переменных:
- CrLf: переменная типа
db
(байт), содержащая символы новой строки (0Dh - перенос каретки, 0Ah - перевод строки, $ - означает конец строки)
- CrLf: переменная типа
- Организация кода:
- Объявление модели программы (.model small) и размера стека (.stack 100h)
- Организация сегментов данных и кода:
- Объявление сегмента данных (.data) и сегмента кода (.code)
- Основная программа:
- Объявление начала процедуры
main
- Объявление начала процедуры
- Установка значения регистра DS:
- Загрузка адреса сегмента данных в регистр AX
- Загрузка значения регистра AX в регистр DS
- Цикл ввода символа:
- Установка значения 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
- Завершение процедуры
main
- Завершение программы
end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д