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

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

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

Здравствуйте. В общем, задание такое: ввести два числа с клавиатуры и вычислить их сумму (TASM). Недавно только познакомился с вводом с клавиатуры. А тут возникли затруднения.
sseg segment 
    db 128 dup(?)
sseg ends
dseg segment
    buff db
    k db 'Vvedite chislo: $'
dseg ends
cseg segment
    assume cs:cseg,ds:dseg,ss:sseg
    start proc far
         mov ax,dseg
         mov ds,ax
         xor ax,ax
     ch1:
         mov ah,09
         mov dx,offset k
         int 21h
         mov ah,3fh
         mov bx,0
         mov dx,offset buff
         int 21h         
     ch2:
         mov ah,09
         mov dx,offset k
         int 21h
         mov ah,3fh
         mov bx,0
         mov dx,offset buff
         int 21h
       
         mov ax,4c00h
         int 21h
         end start
     cseg ends
     end
Сделал только вывод чисел. С командами сложения знаком, только не знаю, как записать числа в регистры.

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

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

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

13   голосов , оценка 3.692 из 5
Похожие ответы