Консультация № 55314
13.09.2006, 17:37
0.00 руб.
0 1 1
Здравствуйте Олег Владимирович ! Спрошу у вас, потому что вы мне все время отвечаете понятным языком. Подскажите как написать программу которая выводит на экран сумму двух чисел, которые вводит пользователь.

Обсуждение

Неизвестный
13.09.2006, 20:08
общий
это ответ
Здравствуйте, Whiteman!

Сначала уточню задачу.
Способ ввода чисел и вывода результата может быть разным. Я предлагю вводить строку типа 56+156=, и заставлять программу дописывать 212, т.е. получится 56+156=212 и курсор окажется на новой строке.
Рассматриваются только натуральные числа, т.к. оперировать дробными числами удобно средствами арифметического сопроцессора, а это - отдельная огромная тема.

Собственно алгоритм программы будет ясен из комментариев. Удачи!

Приложение:
;Итак, приступим...cseg segment assume cs:cseg, ss:sseg, ds:nothing;Сегмент данных здесь не очень нужен - обойдёмся одними;регистрами.;;Процедура ввода числа. Ввод происходит до тех пор,;пока не введут что-то, не являющееся цифрой.;Этот символ будет сохранён в BL, а введённое число - в AX.getnum proc near;Сохраняем изменяемые регистры, которые не используются для;передачи результата. push cx push dx;Это - будущее число. xor dx,dx;Начнём цикл ввода.@gn1: mov ah,1;Функция 1 ожидает нажатия клавиши, а затем отображает введённый;символ на экране и сохраняет его код в AL. int 21h;Проверяем, цифру ли ввели. cmp al,30h jb @gn2 cmp al,39h ja @gn2;Если да, то умножаем DX на 10. Пусть DX=a mov cx,dx ;CX=DX=a shl cx,2 ;CX=4a add dx,cx ;DX=5a shl dx,1 ;DX=10a;Формируем из кода в AL цифру, sub al,30h;и даже не в AL, а в AX. xor ah,ah;И получаем в DX новое число add dx,ax jmp @gn1;Если ввели не цифру, то сохраняем "нецифру" в BL,@gn2: mov bl,al;полученное число в AX mov ax,dx;и выходим из процедуры, восстанавливая регистры. pop dx pop cx retgetnum endpputnum proc near;Процедура вывода числа в AX. Результатов не возвращает. push ax push cx push dx push bx;В процессе придётся делить на 10. mov bx,10;CX - сколько цифр получится. xor cx,cx@pn1: xor dx,dx;Делим DX:AX, т.е. просто AX, на 10. div bx;Получаем неполное частное в AX и остаток в DX. push dx;Так как остаток представляет собой последнюю цифру делимого,;то выводить его сейчас нельзя - надо сперва получить начало;числа.;Поэтому сохраняем его в стэке и запоминаем, что одной цифрой;стало больше. inc cx;Старшую часть нового делимого надо обнулить перед делением. xor dx,dx;Проверим, а вдруг делить больше не надо, т.е. частное = 0. or ax,ax jnz @pn1 ;нет - продолжаем...;Цикл деления закончен. В стэк сохранялись цифры выводимого числа;в обратном порядке => извлекаться они будут в прямом порядке. mov ah,2;Функция 2 выводит символ с кодом DL на экран, меняя содержимое;AL.@pn2: pop dx add dl,30h;Делаем из цифры код. int 21h;Повторяем столько раз, сколько цифр сохранили. loop @pn2;Вывели. pop bx pop dx pop cx pop ax retputnum endp;Следующая процедура выводит два символа - "возврат каретки"(13);и переход на строку вниз(10).;То есть, просто переводит курсор в начало новой строки.crlf proc near push ax push dx mov ah,2 mov dl,13 int 21h mov dl,10 int 21h pop dx pop ax retcrlf endp;Теперь можно применять процедуры.start: call getnum;Первое число получено - в AX.;Смотрим, что с ним хотят сделать. cmp bl,‘+‘;Если не сложить, то выйдем без лишних слов - пока что;программа не поддерживает других действий. jne @quit;Так как второе число будет возвращено в AX, предыдущее;надо запомнить где-нибудь ещё. mov dx,ax call getnum cmp bl,‘=‘ jne @quit;Опять-таки, если не хотят закончить пример, выйдем.;Главная командаadd ax,dx;Выведем сумму call putnum;и переведём курсор. call crlf;Подождём, пока что-нибудь нажмут, просмотрев результаты.;Функция 8 отличается от 1 лишь тем, что не выводит символ на;экран. mov ah,8 int 21h;А теперь законно выйдем.@quit: mov ax,4C00h int 21hcseg endssseg segment stack db 400h dup (0)sseg ends end start
Форма ответа