Сложение, вычитание, умножение и деление-Assambler86 - Assembler

Узнай цену своей работы

Формулировка задачи:

Пожалуйста, помогите. Срочно!!!

Assambler86.

Программа должна работать в эмуляторе

i8086

. 1. Ввести и отладить программу для сложения двоичных чисел (код, данный ниже). 2. Дополнить ее действиями вычитания, умножения и деления. 3. В начале программы реализовать установки желаемого видео режима с помощью функции 00h прерывания INT10h (80 * 25 символов). 4. Предусмотреть возможность выхода из программы или возврат на начало программы после выполнения очередной действия с выдачей на экран уведомления. В случае продолжения реализовать возврат программы в исходное состояние, для чего осуществить очистку экрана прокруткой и установка курсора в исходную позицию (очистка экрана прокруткой - функция 06h или 07h прерывания INT10h установление курсора в исходную позицию - функция 02h прерывания INT10h). 5. Оформить экран вывода по собственному желанию с помощью функций прерывания INT10h).
Листинг программы
  1. .data
  2. num DW ?
  3. msg1 DB 'Calculation Range: [-32768..32767]$'
  4. msg2 DB 10,13,'Enter first number: $'
  5. msg3 DB 10,13, 'Enter second number: $'
  6. msg4 DB 10,13, 'The sum is: $'
  7. msg5 DB 10,13, 'We have overflow!$‘
  8. .code
  9. LEA DX, msg1
  10. CALL out_scr
  11. LEA DX, msg2
  12. CALL out_scr
  13. CALL scan_num
  14. MOV num, CX
  15. LEA DX, msg3
  16. CALL out_scr
  17. CALL scan_num
  18. ADD num, CX
  19. JO overflow; Обработка переполнения
  20. LEA DX, msg4
  21. CALL out_scr
  22. MOV AX, num
  23. CALL print_num
  24. JMP exit
  25. out_scr: ;Процедура вывода на экран
  26. MOV AH, 09h; Функция INT21
  27. INT 21h; Вызов INT21
  28. RET
  29. overflow:
  30. LEA DX, msg5
  31. CALL out_scr
  32. exit: RET
  33. DEFINE_SCAN_NUM
  34. DEFINE_PRINT_NUM
  35. DEFINE_PRINT_NUM_UNS
  36. END

Решение задачи: «Сложение, вычитание, умножение и деление-Assambler86»

textual
Листинг программы
  1.     .8086
  2.     .model compact
  3.     .stack 256
  4.     .data
  5. num     DW ?
  6. msg1    DB 'Calculation Range: [-32768..32767]$'
  7. msg2    DB 13,10, 'Enter first number: $'
  8. msg3    DB 13,10, 'Enter second number: $'
  9. msg4    DB 13,10, 'The sum is: $'
  10. msg5    DB 13,10, 'We have overflow!$'
  11.     .code
  12.     assume ds:@data, ss:@stack
  13. main:
  14.     mov ax, @data ; устанавливаем сегмент данных
  15.     mov ds, ax
  16.    
  17.     mov ax, @stack; устанавливаем сегмент стека
  18.     mov ss, ax
  19.          
  20.     lea dx, msg1
  21.     call out_scr
  22.    
  23.     ; Приглашение ввести число
  24.     lea dx, msg2
  25.     call out_scr
  26.     ; Ввод числа   
  27.     call scan_num
  28.     mov num, cx
  29.    
  30.     ; Приглашение ввести следующее число
  31.     lea dx, msg3
  32.     call out_scr
  33.     ; Ввод числа   
  34.     call scan_num
  35.    
  36.     add num, cx
  37.     jo overflow     ; Не поместилось
  38.    
  39.     ; Вывод результата
  40.     lea dx, msg4
  41.     call out_scr   
  42.     mov ax, num
  43.     call print_num
  44.    
  45.     ; Завершение программы
  46.     mov ax, 4C00h
  47.     int 21h
  48.  
  49. out_scr:
  50.     mov ah, 09h    ; Выдать строку на дисплей
  51.                    ; DS:DX = адрес строки, заканчивающейся символом '$'
  52.     int 21h        ; Вызов INT21
  53.     ret
  54.  
  55. scan_num:
  56.     ; считываем число со знаком в регистр cx
  57.     xor cx, cx
  58.     mov bx, 10
  59.     xor dh, dh   ; dh = 0 - положительное, 1 - отрицательное
  60.     jmp short @1
  61.     nop
  62. @0: mov dh, 1  
  63. @1: mov ah, 01h
  64.     int 21h
  65.  
  66.     ; проверка завершения ввода
  67.     cmp al, 13   ; Enter  
  68.     je @2
  69.     cmp al, ' '  ; Пробел  
  70.     je @2
  71.     cmp al, '   '; Табуляция  
  72.     je @2      
  73.     cmp al, '0'  ; Это не цифра  
  74.     jb @2
  75.     cmp al, '9'  ; Это не цифра  
  76.     ja @2      
  77.     ; проверяем знак
  78.     cmp al, '+'
  79.     je @1
  80.     cmp al, '-'
  81.     je @0
  82.        
  83.     ; умножаем cx на 10
  84.     xchg ax, cx
  85.     imul bx
  86.     jo overflow   ; Не поместилось
  87.     xchg ax, cx
  88.     ; прибавляем очередную цифру
  89.     sub al, '0'    
  90.     xor ah, ah
  91.     add cx, ax
  92.     jo overflow   ; Не поместилось
  93.            
  94.     jmp @1
  95.    
  96.     ; отрицательное число должно быть в дополгительном коде        
  97. @2: test dh, dh
  98.     jz @3
  99.     neg cx   
  100. @3: ret
  101.    
  102. overflow:
  103.     lea  dx, msg5
  104.     call out_scr
  105.     exit:ret
  106.  
  107. print_num:
  108.     ; текущая вершина стека
  109.     mov si, sp
  110.     mov cx, 10   
  111.     ; Печать знака отрицательного числа    
  112.     jns @4
  113.     neg ax
  114.     mov ah, 02h
  115.     mov dl, '-'
  116.     int 21h
  117.     ;укладываем в стек остатки от деления на 10
  118. @4: test ax, ax
  119.     jz @5
  120.  
  121.     xor dx, dx
  122.     idiv cx
  123.     push dx
  124.     jmp @4
  125.  
  126. @5: cmp si, sp
  127.     je @6
  128.  
  129.     ; вынимаем из стека и отправляем на печать
  130.     mov ah, 02h
  131.     pop dx
  132.     add dl, '0'
  133.     int 21h
  134.    
  135.     jmp @5
  136.        
  137. @6: ret
  138.  
  139. ;DEFINE_PRINT_NUM_UNS
  140. end main

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут