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