Деление двухразрядного BCD числа на одноразрядное - Assembler

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

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

Задать с клавиатуры двухразрядное BCD число , затем задать одноразрядное BCD число. Выполнить деление первого числа на второе. Результат записать в предусмотренную ячейку. Предусмотреть: 1. Вывод приглашение к вводу числа 2. Вывод результата на экран.

Решение задачи: «Деление двухразрядного BCD числа на одноразрядное»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         A               dw      ?
  9.         B               db      ?
  10.         R               dw      ?
  11.  
  12.         PromptA         db      'A=', '$'
  13.         PromptB         db      'B=', '$'
  14.         CrLf            db      0Dh, 0Ah, '$'
  15.         msgResult       db      'A/B=', '$'
  16. .code
  17.  
  18. main    proc
  19.         mov     ax,     @data
  20.         mov     ds,     ax
  21.  
  22.         ;ввод двухразрядного BCD числа A
  23.         ;приглашение
  24.         mov     ah,     09h
  25.         lea     dx,     PromptA
  26.         int     21h
  27.         ;старший разряд
  28.         call    GetDigit
  29.         mov     byte ptr[A+1],  al
  30.         ;младший разряд
  31.         call    GetDigit
  32.         mov     byte ptr [A],   al
  33.         ;перевод строки
  34.         mov     ah,     09h
  35.         lea     dx,     CrLf
  36.         int     21h
  37.  
  38.         ;ввод одноразрядного BCD числа B
  39.         ;приглашение
  40.         mov     ah,     09h
  41.         lea     dx,     PromptB
  42.         int     21h
  43.         ;младший разряд
  44.         call    GetDigit
  45.         mov     [B],    al
  46.         ;перевод строки
  47.         mov     ah,     09h
  48.         lea     dx,     CrLf
  49.         int     21h
  50.         ;деление BCD чисел
  51.         mov     ax,     A
  52.         aad                     ;подготовка числа A к делению
  53.         mov     bl,     B
  54.         div     bl
  55.         aam
  56.         mov     R,      ax      ;сохранение результата
  57.  
  58.         ;вывод результата
  59.         mov     ah,     09h
  60.         lea     dx,     msgResult
  61.         int     21h
  62.         mov     ah,     02h
  63.         mov     dl,     byte ptr [R+1]
  64.         add     dl,     '0'
  65.         cmp     dl,     '0'
  66.         je      @@SkipLeadingZero
  67.         int     21h
  68. @@SkipLeadingZero:
  69.         mov     ah,     02h
  70.         mov     dl,     byte ptr [R]
  71.         add     dl,     '0'
  72.         int     21h
  73.  
  74.         mov     ax,     4C00h
  75.         int     21h
  76. main    endp
  77.  
  78. GetDigit        proc
  79.         push    dx
  80. @@Input:
  81.         ;ввод символа без отображения на экран
  82.         mov     ah,     08h
  83.         int     21h
  84.         ;это цифра?
  85.         ; нет - повторить ввод
  86.         cmp     al,     '0'
  87.         jb      @@Input
  88.         cmp     al,     '9'
  89.         ja      @@Input
  90.         ;вывод цифры на экран
  91.         mov     ah,     02h
  92.         mov     dl,     al
  93.         int     21h
  94.         ;преобразование символа в цифру
  95.         sub     al,     '0'
  96.         pop     dx
  97.         ret
  98. GetDigit        endp
  99. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут