Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите исправить калькулятор (http://www.tehnari.ru/f41/t96587/)

factik 26.05.2014 20:22

Помогите исправить калькулятор
 
.model tiny ;COM - файл
.code
.386 ;используем eax
org 100h
start:
vvod1: ;выбор функции
xor eax,eax ;обнуляем регистры
xor edx,edx ;
call clrscr
mov ah,9 ;Вывод сторки мессаге1
mov dx,offset message1 ;
int 21h ;
mov ah,08h ;считать символ с клавиатуры
int 21h ;
cmp al,'+' ;сравнение с '+'
je cloj ;значит складываем
cmp al,'-'
je vich ;вычитание
cmp al,'/'
je dele ;деление
cmp al,'*'
je rr1 ;используем jmp т.к далеко
jmp rr ;
rr1: jmp umnoj ;Умножение
rr: cmp al,'q' ;выход
je quit
cmp al,'Q'
je quit
jmp short vvod1 ;если не ввели то повторять ввод
quit:
ret ;Выход
cloj: ;Сложение dx+ax->ax
call clrscr ;стереть экран

call aa1 ;ввод а
push dx ;сохраняем dx в стеке
call bb1 ;ввод b
pop dx ;вытаскиваем dx из стека
add ax,dx ;складываем ax и dx результат в eax

call print

call endstrd
mov ah,9 ;Вывод сторки мессаге2
mov dx,offset message2 ;
int 21h
mov ah,08h
int 21h ;
jmp vvod1
vich: ;вычитание

call clrscr ;стереть экран
call aa1 ;ввод а
push dx
call bb1 ;ввод b

pop dx
sub dx,ax ;вычитаем из dx ax результат в edx
mov ax,dx ;переносим его eax

call print ;выводит eax в десятичной системе

call endstrd
mov ah,9 ;Вывод сторки мессаге2
mov dx,offset message2 ;
int 21h
mov ah,08h
int 21h ;
jmp vvod1

dele: ;деление (цело численное)
call clrscr ;стереть экран
call aa1 ;ввод а
push dx
call bb1 ;ввод b

pop dx
xchg dx,ax
mov cx,dx ;сохраняем делитель в cx
xor dx,dx ;обнуляем dx там будет остаток
div cx ;делим результат в eax

call print

call endstrd
mov ah,9 ;Вывод сторки мессаге2
mov dx,offset message2 ;
int 21h
mov ah,08h
int 21h ;


jmp vvod1
umnoj: ;умножение
call clrscr ;стереть экран
call aa1 ;ввод а
push dx
call bb1 ;ввод b
pop dx

mul edx ;умножаем результат в eax

call print

call endstrd
mov ah,9 ;Вывод сторки мессаге2
mov dx,offset message2 ;
int 21h
mov ah,08h
int 21h ;
jmp vvod1
clrscr:
xor dx,dx ;положение курсора dh-строка dl-столбец
mov ah,02h ;установить в 0,0
int 10h ;
mov bl,0000111b ;атрибут символов белый на чёрном
mov cx,25*80 ;количество символов
mov ax,0920h ;вывод 25*80 пробелов
int 10h ;
ret
endp
aa1: ;ввод а
mov dx,offset aaaa
mov ah,9
int 21h
call mover
mov dx,ax ;перенесём в dx
ret
endp
bb1: ;ввод а
mov dx,offset bbbb
mov ah,9
int 21h
call mover
ret
endp

mover:
mov dx,offset bufer ;аресс буфера
mov ah,0ah ;считать строку данных в буфер
int 21h ;
mov dx,offset endstr ;перенос курсора на строку ниже
mov ah,9 ;
int 21h ;
;перевод из строки в бинарное число
xor di,di ;начало буферв
xor ax,ax ;текущее значение ax
mov cl,blength
xor ch,ch
xor bx,bx
mov si,cx ;длинна буфера
mov cl,10 ;множитель
tohex:
mov bl,byte ptr bconteg[di]
sub bl,'0' ;цифра = код символа - код символа '0'
jb tata ;если ко символа < чем код '0'
cmp bl,9 ;или > чем '9'
ja tata ;начать ввод занаво
mul cx ;иначе умножить на 10
add ax,bx ;добавить к ax новую цифру
inc di ;увеличить адресс
cmp di,si ;если он меньше чем кол. символов + 1
jb tohex
jmp tra
tata: jmp vvod1 ;Нужно использовать дальний переход
tra: ret
endp

print:

mov ebx,0ah ;делитель
xor cx,cx ;счётчик

divloop:
xor edx,edx ;обнуляем edx
div ebx ;делим на 10
add edx,'0' ;дописываем к остатку деления код нуля
push edx ;сохраняем число в стеке
inc cx ;увеличиваем счётчик на 1
test eax,eax ;если есть что делить то
jnz divloop ;продолжаем делить(если не ноль)
restore:
pop eax ;читаем записанные числа из стека
mov edx,eax ;пишем их в eax
mov ah,2 ;функция вывода символа по коду код в al
int 21h ;
dec cx ;уменьшаем счетчик
cmp cx,0 ;если он не = нолю
jne restore ;то проолжаем вывод
ret
endp

endstrd:
mov dx,offset endstr ;перенос курсора на строку ниже
mov ah,9 ;
int 21h ;
ret
endp
ret
message1 db "PRESS",0dh,0ah
db "+ for add. a+b.",0dh,0ah
db "- for sub. a-b",0dh,0ah
db "/ for div. a/b",0dh,0ah
db "* for mul. a*b",0dh,0ah
db "q for quit",0dh,0ah,'$'
message2 db "Press any key",0dh,0ah,'$'
aaaa db "a=",'$'
bbbb db "b=",'$'
endstr db 0dh,0ah,'$'
enderes db ' ',0dh,0ah,'$'
bufer db 5 ;max размер ввода чисел
blength db ? ;размер буфера после считывания
bconteg: ;содержимое буфера будет за концом файла
hexstring equ bconteg
end start


Часовой пояс GMT +4, время: 05:06.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.