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