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