Сложение, вычитание, умножение и деление-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

Оцени полезность:

8   голосов , оценка 4.25 из 5