Вычислить 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
- завершение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д