Сложение, вычитание, умножение и деление-Assambler86 - Assembler
Формулировка задачи:
Пожалуйста, помогите. Срочно!!!
Assambler86.
Программа должна работать в эмулятореi8086
. 1. Ввести и отладить программу для сложения двоичных чисел (код, данный ниже). 2. Дополнить ее действиями вычитания, умножения и деления. 3. В начале программы реализовать установки желаемого видео режима с помощью функции 00h прерывания INT10h (80 * 25 символов). 4. Предусмотреть возможность выхода из программы или возврат на начало программы после выполнения очередной действия с выдачей на экран уведомления. В случае продолжения реализовать возврат программы в исходное состояние, для чего осуществить очистку экрана прокруткой и установка курсора в исходную позицию (очистка экрана прокруткой - функция 06h или 07h прерывания INT10h установление курсора в исходную позицию - функция 02h прерывания INT10h). 5. Оформить экран вывода по собственному желанию с помощью функций прерывания INT10h)..data num DW ? msg1 DB 'Calculation Range: [-32768..32767]$' msg2 DB 10,13,'Enter first number: $' msg3 DB 10,13, 'Enter second number: $' msg4 DB 10,13, 'The sum is: $' msg5 DB 10,13, 'We have overflow!$‘ .code LEA DX, msg1 CALL out_scr LEA DX, msg2 CALL out_scr CALL scan_num MOV num, CX LEA DX, msg3 CALL out_scr CALL scan_num ADD num, CX JO overflow; Обработка переполнения LEA DX, msg4 CALL out_scr MOV AX, num CALL print_num JMP exit out_scr: ;Процедура вывода на экран MOV AH, 09h; Функция INT21 INT 21h; Вызов INT21 RET overflow: LEA DX, msg5 CALL out_scr exit: RET DEFINE_SCAN_NUM DEFINE_PRINT_NUM DEFINE_PRINT_NUM_UNS END
Решение задачи: «Сложение, вычитание, умножение и деление-Assambler86»
textual
Листинг программы
.8086 .model compact .stack 256 .data num DW ? msg1 DB 'Calculation Range: [-32768..32767]$' msg2 DB 13,10, 'Enter first number: $' msg3 DB 13,10, 'Enter second number: $' msg4 DB 13,10, 'The sum is: $' msg5 DB 13,10, 'We have overflow!$' .code assume ds:@data, ss:@stack main: mov ax, @data ; устанавливаем сегмент данных mov ds, ax mov ax, @stack; устанавливаем сегмент стека mov ss, ax lea dx, msg1 call out_scr ; Приглашение ввести число lea dx, msg2 call out_scr ; Ввод числа call scan_num mov num, cx ; Приглашение ввести следующее число lea dx, msg3 call out_scr ; Ввод числа call scan_num add num, cx jo overflow ; Не поместилось ; Вывод результата lea dx, msg4 call out_scr mov ax, num call print_num ; Завершение программы mov ax, 4C00h int 21h out_scr: mov ah, 09h ; Выдать строку на дисплей ; DS:DX = адрес строки, заканчивающейся символом '$' int 21h ; Вызов INT21 ret scan_num: ; считываем число со знаком в регистр cx xor cx, cx mov bx, 10 xor dh, dh ; dh = 0 - положительное, 1 - отрицательное jmp short @1 nop @0: mov dh, 1 @1: mov ah, 01h int 21h ; проверка завершения ввода cmp al, 13 ; Enter je @2 cmp al, ' ' ; Пробел je @2 cmp al, ' '; Табуляция je @2 cmp al, '0' ; Это не цифра jb @2 cmp al, '9' ; Это не цифра ja @2 ; проверяем знак cmp al, '+' je @1 cmp al, '-' je @0 ; умножаем cx на 10 xchg ax, cx imul bx jo overflow ; Не поместилось xchg ax, cx ; прибавляем очередную цифру sub al, '0' xor ah, ah add cx, ax jo overflow ; Не поместилось jmp @1 ; отрицательное число должно быть в дополгительном коде @2: test dh, dh jz @3 neg cx @3: ret overflow: lea dx, msg5 call out_scr exit:ret print_num: ; текущая вершина стека mov si, sp mov cx, 10 ; Печать знака отрицательного числа jns @4 neg ax mov ah, 02h mov dl, '-' int 21h ;укладываем в стек остатки от деления на 10 @4: test ax, ax jz @5 xor dx, dx idiv cx push dx jmp @4 @5: cmp si, sp je @6 ; вынимаем из стека и отправляем на печать mov ah, 02h pop dx add dl, '0' int 21h jmp @5 @6: ret ;DEFINE_PRINT_NUM_UNS end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д