Вычислить 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
Объяснение кода листинга программы
InputA
,InputB
,CrLf
,A
,B
,Result
- объявление переменныхmov ax, @data
,mov ds, ax
- загрузка сегмента данныхmov ah, 09h
,lea dx, InputA
,int 21h
- вывод на экран сообщенияInput A:
call GetNumber
,mov A, al
- вызов процедуры для ввода числа A и сохранение его в переменную Amov ah, 09h
,lea dx, CrLf
,int 21h
- вывод на экран перевода строкиmov ah, 09h
,lea dx, InputB
,int 21h
- вывод на экран сообщенияInput B:
call
GetNumber
,mov B, al
- вызов процедуры для ввода числа B и сохранение его в переменную Bmov al, B
,cbw
,mov bl, 2
,idiv bl
,add al, A
- вычисление выражения A+B/2mov Result, al
- сохранение результатаcall ShowHex
- вывод результата в шестнадцатеричном видеmov ax, 4C00h
,int 21h
- завершение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д