Деление двухразрядного 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

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

  1. Предполагаемая постановка задачи: Деление двухразрядного BCD числа на одноразрядное.
  2. Описание работы программы:
    • Ввод двухразрядного BCD числа A
    • Ввод одноразрядного BCD числа B
    • Деление BCD чисел
    • Сохранение результата в переменной R
    • Вывод результата на экран
  3. Логика работы программы:
    • Переменная A содержит два разряда BCD числа
    • Переменная B содержит один разряд BCD числа
    • Переменная R используется для сохранения результата деления
    • Для ввода чисел используется процедура GetDigit, которая:
      • Вводит символ без отображения на экран
      • Проверяет, является ли введенный символ цифрой
      • Если это цифра, выводит ее на экран и преобразует в числовое значение
  4. Описание кода:
    • Используется ассемблерный язык
    • Применяется модель малого языка
    • Используется стек размером 100 байт
    • В сегменте данных размещены переменные A, B и R
    • В сегменте кода размещен основной процедурный блок main
    • В сегменте кода размещена вспомогательная процедурная блок GetDigit
    • Для ввода чисел используется функция 08h, которая не отображает введенный символ на экран
    • Для вывода чисел используется функция 02h, которая выводит однобайтовый символ на экран
    • Для деления чисел используется инструкция div
    • Для преобразования BCD числа в десятичное число используется инструкция aam
    • Для пропуска ведущего нуля в десятичном числе используется метка @@SkipLeadingZero и инструкции jb и ja
  5. Примечание:
    • В реальном коде необходимо добавить обработку ошибок для исключения переполнения при делении

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

7   голосов , оценка 4.429 из 5