Вычислить 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:callGetNumber,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- завершение программы