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

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

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

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

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

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        InputA  db      'Input A: ', '$'
        InputB  db      'Input B: ', '$'
        CrLf    db      0Dh, 0Ah, '$'
        A       db      ?
        B       db      ?
        Result  db      ?
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;ввод числа A
        mov     ah,     09h
        lea     dx,     InputA
        int     21h
        call    GetNumber
        mov     A,      al
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;ввод числа B
        mov     ah,     09h
        lea     dx,     InputB
        int     21h
        call    GetNumber
        mov     B,      al
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;вычисление выражения
        mov     al,     B
        cbw
        mov     bl,     2
        idiv    bl
        add     al,     A
 
        mov     Result, al
 
        call    ShowHex
 
        mov     ax,     4C00h
        int     21h
main    endp
 
GetNumber       proc
        push    bx
        push    cx
        push    dx
 
        mov     bx,     0       ;число положительное
        mov     cx,     0       ;ввод числа не завершён
@@Input:
        mov     ah,     8
        int     21h
        cmp     al,     '-'
        jne     @@TestIsDigit
        cmp     bx,     1       ;знак '-' уже вводился?
        je      @@Input
        mov     bx,     1       ;число отрицательное
        jmp     @@ShowChar
@@TestIsDigit:
        cmp     al,     '0'
        jb      @@Input
        cmp     al,     '9'
        ja      @@Input
        mov     cx,     1       ;ввод числа завершён
@@ShowChar:
        mov     ah,     2
        mov     dl,     al
        int     21h
 
        cmp     cx,     1       ;ввод числа завершён?
        jne     @@Input
 
        sub     al,     '0'
 
        cmp     bx,     1
        jne     @@Positive
        neg     al
@@Positive:
        pop     dx
        pop     cx
        pop     bx
        ret
GetNumber       endp
 
;выводит на экран в 16 системе счисления содержимое регистра AL
; входные данные:
; al - число для отображения
ShowHex proc
        push    ax
        push    cx
        push    dx
 
        ; Начинаем перевод числа AL в строку
        mov    cl,      4               ; 8-битный регистр, будем выводить по 4 бита (0..F)
        mov    bx,      ax              ; Сохраняем число в BX
 
        shr    al,      cl              ; Сдвигаем на CL бит вправо
        and    al,      0Fh             ; Получаем в AL цифру 0..15
        add    al,      '0'             ; Получаем в AL символ цифры
        cmp    al,      '9'             ; Проверяем цифру
        jbe    @@Digit09_1              ; Прыгаем, если это цифра 0..9
        add    al,      'A'-('9'+1)     ; Иначе (для A..F) корректируем ее
 
@@Digit09_1:
        mov     ah,     02h
        mov     dl,     al
        int     21h                     ; Выводим символ в AL на экран
 
        mov     ax,     bx
 
        and    al,      0Fh             ; Получаем в AL цифру 0..15
        add    al,      '0'             ; Получаем в AL символ цифры
        cmp    al,      '9'             ; Проверяем цифру
        jbe    @@Digit09_2              ; Прыгаем, если это цифра 0..9
        add    al,      'A'-('9'+1)     ; Иначе (для A..F) корректируем ее
 
@@Digit09_2:
        mov     ah,     02h
        mov     dl,     al
        int     21h                     ; Выводим символ в AL на экран
 
        pop     dx
        pop     cx
        pop     ax
        ret
ShowHex endp
 
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
Похожие ответы