Деление двухразрядного BCD числа на одноразрядное - Assembler
Формулировка задачи:
Задать с клавиатуры двухразрядное BCD число , затем задать одноразрядное BCD число. Выполнить деление первого числа на второе. Результат записать в предусмотренную ячейку.
Предусмотреть:
1. Вывод приглашение к вводу числа
2. Вывод результата на экран.
Решение задачи: «Деление двухразрядного BCD числа на одноразрядное»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- A dw ?
- B db ?
- R dw ?
- PromptA db 'A=', '$'
- PromptB db 'B=', '$'
- CrLf db 0Dh, 0Ah, '$'
- msgResult db 'A/B=', '$'
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;ввод двухразрядного BCD числа A
- ;приглашение
- mov ah, 09h
- lea dx, PromptA
- int 21h
- ;старший разряд
- call GetDigit
- mov byte ptr[A+1], al
- ;младший разряд
- call GetDigit
- mov byte ptr [A], al
- ;перевод строки
- mov ah, 09h
- lea dx, CrLf
- int 21h
- ;ввод одноразрядного BCD числа B
- ;приглашение
- mov ah, 09h
- lea dx, PromptB
- int 21h
- ;младший разряд
- call GetDigit
- mov [B], al
- ;перевод строки
- mov ah, 09h
- lea dx, CrLf
- int 21h
- ;деление BCD чисел
- mov ax, A
- aad ;подготовка числа A к делению
- mov bl, B
- div bl
- aam
- mov R, ax ;сохранение результата
- ;вывод результата
- mov ah, 09h
- lea dx, msgResult
- int 21h
- mov ah, 02h
- mov dl, byte ptr [R+1]
- add dl, '0'
- cmp dl, '0'
- je @@SkipLeadingZero
- int 21h
- @@SkipLeadingZero:
- mov ah, 02h
- mov dl, byte ptr [R]
- add dl, '0'
- int 21h
- mov ax, 4C00h
- int 21h
- main endp
- GetDigit proc
- push dx
- @@Input:
- ;ввод символа без отображения на экран
- mov ah, 08h
- int 21h
- ;это цифра?
- ; нет - повторить ввод
- cmp al, '0'
- jb @@Input
- cmp al, '9'
- ja @@Input
- ;вывод цифры на экран
- mov ah, 02h
- mov dl, al
- int 21h
- ;преобразование символа в цифру
- sub al, '0'
- pop dx
- ret
- GetDigit endp
- end main
Объяснение кода листинга программы
- Предполагаемая постановка задачи: Деление двухразрядного BCD числа на одноразрядное.
- Описание работы программы:
- Ввод двухразрядного BCD числа A
- Ввод одноразрядного BCD числа B
- Деление BCD чисел
- Сохранение результата в переменной R
- Вывод результата на экран
- Логика работы программы:
- Переменная A содержит два разряда BCD числа
- Переменная B содержит один разряд BCD числа
- Переменная R используется для сохранения результата деления
- Для ввода чисел используется процедура GetDigit, которая:
- Вводит символ без отображения на экран
- Проверяет, является ли введенный символ цифрой
- Если это цифра, выводит ее на экран и преобразует в числовое значение
- Описание кода:
- Используется ассемблерный язык
- Применяется модель малого языка
- Используется стек размером 100 байт
- В сегменте данных размещены переменные A, B и R
- В сегменте кода размещен основной процедурный блок main
- В сегменте кода размещена вспомогательная процедурная блок GetDigit
- Для ввода чисел используется функция 08h, которая не отображает введенный символ на экран
- Для вывода чисел используется функция 02h, которая выводит однобайтовый символ на экран
- Для деления чисел используется инструкция div
- Для преобразования BCD числа в десятичное число используется инструкция aam
- Для пропуска ведущего нуля в десятичном числе используется метка @@SkipLeadingZero и инструкции jb и ja
- Примечание:
- В реальном коде необходимо добавить обработку ошибок для исключения переполнения при делении
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д