код:
| Цитата | dseg segment .386 op1 dd 0 d dd 0 osn dd 10 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,vv int 21h call input ;ввод первого операнда и занесение его в перем ор1 mov eax,d mov op1,eax
menu: mov al,dey ;в al копируем содержимое dey cmp al,'=' ;сравнение al со знаком = (если нет - переход на m1) jne m1 call output mov ah,7h int 21h mov ah,4ch int 21h
m1: cmp al,'+' ;сравнение al со знаком + (если нет - переход на m2) jne m2 call input mov eax,d add op1,eax ;op1=op1+ax jmp menu m2: cmp al,'-' ;сравнение а1 со знаком - (если нет - переход на m3) jne m3 call input mov eax,d sub op1,eax ;op1=op1-ax jmp menu m3: cmp al,'*' ;сравнение al со знаком * (если нет - переход на m4) jne m4 call input mov eax,op1 mul d mov op1,eax jmp menu m4: cmp al,'/' ;сравнение al со знаком / (если нет - переход на menu) jne menu call input mov eax,op1 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 cmp al,'=' jne h mov dey,al ret
h: cmp al,'0' ;сравнение кода символа с кодом нуля (>= то переход на dal1) jge dal1 mov dey,al ret dal1: cmp al,'9' ;сравнение кода символа с кодом 9 (<= то переход на dal2) jle dal2 mov ah,9h ;сообщение - введено не число lea dx,s int 21h jmp begin dal2: sub al,'0' ;вычитание из кода символа код нуля, чтобы получить число cbw mov esi,eax ;сохр числа в si mov eax,d mul osn jnc dal3 ;нет переноса, то переход на dal3 mov ah,9h ;сообщение - большое число lea dx,gr int 21h mov ah,4ch int 21h dal3: add eax,esi mov d,eax jmp begin input endp
;-----------------------------процедура вывода--------------------------------- output proc mov eax,op1 mov cx,0 out_dec: mov dx,0 div osn push dx inc cx cmp eax,0 jne out_dec dmet: pop dx add dl,'0' mov ah,2h int 21h loop dmet ret output endp code ends end start
|
Не получается: 1 вычитание (если вычитаемое больше) 2 деление |