Сумма чисел, введенных с клавиатуры - Assembler

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

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

Здравствуйте. В общем, задание такое: ввести два числа с клавиатуры и вычислить их сумму (TASM). Недавно только познакомился с вводом с клавиатуры. А тут возникли затруднения.
Листинг программы
  1. sseg segment
  2. db 128 dup(?)
  3. sseg ends
  4. dseg segment
  5. buff db
  6. k db 'Vvedite chislo: $'
  7. dseg ends
  8. cseg segment
  9. assume cs:cseg,ds:dseg,ss:sseg
  10. start proc far
  11. mov ax,dseg
  12. mov ds,ax
  13. xor ax,ax
  14. ch1:
  15. mov ah,09
  16. mov dx,offset k
  17. int 21h
  18. mov ah,3fh
  19. mov bx,0
  20. mov dx,offset buff
  21. int 21h
  22. ch2:
  23. mov ah,09
  24. mov dx,offset k
  25. int 21h
  26. mov ah,3fh
  27. mov bx,0
  28. mov dx,offset buff
  29. int 21h
  30. mov ax,4c00h
  31. int 21h
  32. end start
  33. cseg ends
  34. end
Сделал только вывод чисел. С командами сложения знаком, только не знаю, как записать числа в регистры.

Решение задачи: «Сумма чисел, введенных с клавиатуры»

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. end main

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


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

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

13   голосов , оценка 3.692 из 5

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

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

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