Новичок
Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.12.2005
Репутация: нет Всего: нет
|
спасибо Chingachgukя твой код подредачил теперь считаит большие числа нормально...и ошибку с нулём тоже сделал...а как сделать чтоб он отрицательные числа считал не подскажеш? например 1-2=-1 он если такой пример ему дать выдаёт 1-2=4294967295 вот код новый | Код | ;Калькулятор. Выполняет +,-,*,/ ;Для просмотра результата нужно нажать = ;-------------------------------начало сегмента данных------------------------- dseg segment .386 op1 dd 0 d dd 0 osn dd 10 ab db 10,13,'Calc v1.0 Умножает, делит, складывает и вычитает. Не работает с отрицательными числами и часлами с запятой ','$' vv db 10,13,'вводите пример в виде: число1_знак операции_число2_знак равно',10,13,'$' s db 10,13,'это не число',10,13,'$' gr db 10,13,'это число очень большое',10,13,'$' n db 10,13,'делить на ноль нельзя','$' dey db 0 dseg ends ;---------------------------начало сегмента кода------------------------------- code segment use16 assume cs:code, ds:dseg;установка связи между сегментами и сегментными регистрами start: mov ax,dseg mov ds,ax mov ah,9 lea dx,ab int 21h mov ah,9 ;строка с образцом ввода примера lea dx,vv int 21h call input ;ввод первого операнда mov eax,d ;и занесение его mov op1,eax ;в переменную ор1
menu: mov al,dey ;в al копируем содержимое dey cmp al,'=' ;сравнение al со знаком = jne m1 ;если не равно, то переход на m1 call output ;вызов процедуры ввода mov ah,7h ;ожидание нажатия int 21h ;клавиши mov ah,4ch ;выход в DOS int 21h
m1: cmp al,'+' ;сравнение al со знаком + jne m2 ;если не равно, то переход на m2 call input ;вызов процедуры ввода mov eax,d ;копирование d в ах add op1,eax ;op1=op1+ax jmp menu ;переход на menu m2: cmp al,'-' ;сравнение а1 со знаком - jne m3 ;если не равно, то переход на m3 call input ;вызов процедуры ввода mov eax,d ;копирование d в ах sub op1,eax ;op1=op1-ax jmp menu ;переход на menu m3: cmp al,'*' ;сравнение al со знаком * jne m4 ;если не равно, то переход на m4 call input ;вызов процедуры ввода mov eax,op1 ;копирование ор1 в ах mul d ;умножение ах на d mov op1,eax ;копирование ах в ор1 jmp menu ;переход на menu m4: cmp al,'/' ;сравнение al со знаком / jne menu ;если не равно, то переход на menu call input ;вызов процедуры ввода mov eax,op1 ;копирование ор1 в ах cmp al,'0' jnz nolb div d ;деление ах на d mov op1,eax ;копирование ах в ор1 jmp menu ;переход на menu nolb: mov ah,9 lea dx,n int 21h call output ;------------------------------процедуры--------------------------------------- ;----------------------------процедура ввода----------------------------------- input proc ;процедура ввода числа mov d,0 begin: mov ah,1h ;ожидание нажатия клавиши и вывод int 21h ;введённого символа на экран, в а1 получаем код символа cmp al,'=' jne h mov dey,al ret h: cmp al,'0' ;сравнение кода символа с кодом нуля jge dal1 ;если больше или равно, то перейти на dal1 mov dey,al ret dal1: cmp al,'9' ;сравнение кода символа с кодом 9 jle dal2 ;если меньше или равно, то переход на dal2 mov ah,9h ;вывод строки lea dx,s ;с сообщением о вводе int 21h ;недопустимого символа jmp begin ;переход на begin dal2: sub al,'0' ;вычитание из кода символа код нуля, чтобы получить число cbw ;расширение al до ax mov esi,eax ;сохранение числа в si mov eax,d ;копирование в ах числа, которое хранится в d (сначала = 0) mul osn ;умножение ах на 10 jnc dal3 ;если не было переноса, то переход на dal3 mov ah,9h ;вывод строки lea dx,gr ;с сообщение о вводе int 21h ;слишком большого числа mov ah,4ch ;выход в дос DOS int 21h dal3: add eax,esi ;добавление к уже введённому числу новой цифры mov d,eax ;занесение полученного числа в d jmp begin ;переход на начало ввода input endp ;-----------------------------процедура вывода--------------------------------- output proc mov eax,op1 ;копирование содиржимого d в ах mov cx,0 ;обнуление сх out_dec: mov dx,0 ;обнуление dx div osn ;деление содержимого dx на 10 push dx ;содержимое dx в стэк inc cx ;увеличение cx cmp eax,0 ;сравнение ax с 0 jne out_dec ;если не равно, то переход на out_dec dmet: pop dx ;содержимое стэка в dx add dl,'0' ;прибавление к dl кода нуля mov ah,2h ;вывод символа на экран int 21h loop dmet ;цикл dmet ret output endp code ends end start
|
|