Вычислить A+B/2. Вывести результат в 16-ричном виде в файл - Assembler

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

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

Необходимо ввести с клавиатуры два знаковых числа, обозначаемых А и B в диапазоне от -9 до 9, вычислить A+B/2 ? вывести результат в 16-ричном виде в файл, пожалуйста помогите.

Решение задачи: «Вычислить A+B/2. Вывести результат в 16-ричном виде в файл»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         InputA  db      'Input A: ', '$'
  9.         InputB  db      'Input B: ', '$'
  10.         CrLf    db      0Dh, 0Ah, '$'
  11.         A       db      ?
  12.         B       db      ?
  13.         Result  db      ?
  14. .code
  15.  
  16. main    proc
  17.         mov     ax,     @data
  18.         mov     ds,     ax
  19.  
  20.         ;ввод числа A
  21.         mov     ah,     09h
  22.         lea     dx,     InputA
  23.         int     21h
  24.         call    GetNumber
  25.         mov     A,      al
  26.         mov     ah,     09h
  27.         lea     dx,     CrLf
  28.         int     21h
  29.         ;ввод числа B
  30.         mov     ah,     09h
  31.         lea     dx,     InputB
  32.         int     21h
  33.         call    GetNumber
  34.         mov     B,      al
  35.         mov     ah,     09h
  36.         lea     dx,     CrLf
  37.         int     21h
  38.         ;вычисление выражения
  39.         mov     al,     B
  40.         cbw
  41.         mov     bl,     2
  42.         idiv    bl
  43.         add     al,     A
  44.  
  45.         mov     Result, al
  46.  
  47.         call    ShowHex
  48.  
  49.         mov     ax,     4C00h
  50.         int     21h
  51. main    endp
  52.  
  53. GetNumber       proc
  54.         push    bx
  55.         push    cx
  56.         push    dx
  57.  
  58.         mov     bx,     0       ;число положительное
  59.         mov     cx,     0       ;ввод числа не завершён
  60. @@Input:
  61.         mov     ah,     8
  62.         int     21h
  63.         cmp     al,     '-'
  64.         jne     @@TestIsDigit
  65.         cmp     bx,     1       ;знак '-' уже вводился?
  66.         je      @@Input
  67.         mov     bx,     1       ;число отрицательное
  68.         jmp     @@ShowChar
  69. @@TestIsDigit:
  70.         cmp     al,     '0'
  71.         jb      @@Input
  72.         cmp     al,     '9'
  73.         ja      @@Input
  74.         mov     cx,     1       ;ввод числа завершён
  75. @@ShowChar:
  76.         mov     ah,     2
  77.         mov     dl,     al
  78.         int     21h
  79.  
  80.         cmp     cx,     1       ;ввод числа завершён?
  81.         jne     @@Input
  82.  
  83.         sub     al,     '0'
  84.  
  85.         cmp     bx,     1
  86.         jne     @@Positive
  87.         neg     al
  88. @@Positive:
  89.         pop     dx
  90.         pop     cx
  91.         pop     bx
  92.         ret
  93. GetNumber       endp
  94.  
  95. ;выводит на экран в 16 системе счисления содержимое регистра AL
  96. ; входные данные:
  97. ; al - число для отображения
  98. ShowHex proc
  99.         push    ax
  100.         push    cx
  101.         push    dx
  102.  
  103.         ; Начинаем перевод числа AL в строку
  104.         mov    cl,      4               ; 8-битный регистр, будем выводить по 4 бита (0..F)
  105.         mov    bx,      ax              ; Сохраняем число в BX
  106.  
  107.         shr    al,      cl              ; Сдвигаем на CL бит вправо
  108.         and    al,      0Fh             ; Получаем в AL цифру 0..15
  109.         add    al,      '0'             ; Получаем в AL символ цифры
  110.         cmp    al,      '9'             ; Проверяем цифру
  111.         jbe    @@Digit09_1              ; Прыгаем, если это цифра 0..9
  112.         add    al,      'A'-('9'+1)     ; Иначе (для A..F) корректируем ее
  113.  
  114. @@Digit09_1:
  115.         mov     ah,     02h
  116.         mov     dl,     al
  117.         int     21h                     ; Выводим символ в AL на экран
  118.  
  119.         mov     ax,     bx
  120.  
  121.         and    al,      0Fh             ; Получаем в AL цифру 0..15
  122.         add    al,      '0'             ; Получаем в AL символ цифры
  123.         cmp    al,      '9'             ; Проверяем цифру
  124.         jbe    @@Digit09_2              ; Прыгаем, если это цифра 0..9
  125.         add    al,      'A'-('9'+1)     ; Иначе (для A..F) корректируем ее
  126.  
  127. @@Digit09_2:
  128.         mov     ah,     02h
  129.         mov     dl,     al
  130.         int     21h                     ; Выводим символ в AL на экран
  131.  
  132.         pop     dx
  133.         pop     cx
  134.         pop     ax
  135.         ret
  136. ShowHex endp
  137.  
  138. end     main

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

  1. InputA, InputB, CrLf, A, B, Result - объявление переменных
  2. mov ax, @data, mov ds, ax - загрузка сегмента данных
  3. mov ah, 09h, lea dx, InputA, int 21h - вывод на экран сообщения Input A:
  4. call GetNumber, mov A, al - вызов процедуры для ввода числа A и сохранение его в переменную A
  5. mov ah, 09h, lea dx, CrLf, int 21h - вывод на экран перевода строки
  6. mov ah, 09h, lea dx, InputB, int 21h - вывод на экран сообщения Input B:
  7. call GetNumber, mov B, al - вызов процедуры для ввода числа B и сохранение его в переменную B
  8. mov al, B, cbw, mov bl, 2, idiv bl, add al, A - вычисление выражения A+B/2
  9. mov Result, al - сохранение результата
  10. call ShowHex - вывод результата в шестнадцатеричном виде
  11. mov ax, 4C00h, int 21h - завершение программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

6   голосов , оценка 3.833 из 5

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

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

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