Ввести число в 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д