Bardzo proszę o pomoc.
Program ma wypisywać miejsce zerowe funkcji liniowej.
Nie wiem jak wypisać wartość wynik ani czy ten program będzie działał.
Nie znam za dobrze asemblera dlatego proszę tutaj o pomoc, zostało mi już nie dużo czasu a muszę jeszcze wykres funkcji zrobić.
Program ma działać na współczynnikach całkowitych i wyświetlać wynik z dokładnością do 2 miejsc po przecinku.
Proszę o wskazówki i wskazanie ewentualnych błędów.
code1 segment
start:
mov ax,seg top1 ;inicjalizacja stosu
mov ss,ax
mov sp,offset top1
mov ax,seg podaja
mov ds,ax
zacznija:
mov word ptr ds:[inta],0h ;wyzerowanie zmiennej a
mov dx,offset podaja ;zapytanie o zmienna a
mov ah,9h
int 21h
mov ah,0ah
mov dx,offset stringl
int 21h
call endline ;przejscie kursorem do nowej lini
mov bx,2h ;bx=2 aby porownac znak liczby
xor ax,ax
cmp ds:[bx+stringl],'-' ;sprawdzenie, czy a jest ujemne
jne bez_znaku_a ;znak=0 znak dodatni znak!=0 znak ujemny
inc znaka
inc bx
bez_znaku_a:
xor dh,dh
mov dl,ds:[bx+stringl] ;odczytujemy wartosci ze stringa bx-pokazuje aktualny znak
cmp dl,0dh ;jesli koniec tesktu (0dh powrot karetki)
je zacznijb
daleja:
cmp dl,30h ;sprawdza czy znak jest cyfra (30h znak 0)
jb zlyformata
cmp dl,39h ;39h znak 9
ja zlyformata
sub dl,30h
push dx
call mulinta ;mulinta mnozy a 10x liczbe odczytujemy od lewej
pop dx
add word ptr ds:[inta],dx ;przeksztalca znak na liczbe
inc bx
jmp bez_znaku_a ;czyta nastepny znak
zacznijb:
call zerujkopiab ;wyzerowanie zmiennej b
mov word ptr ds:[intb],0h
mov dx,offset podajb ;zapytanie o zmienna b
mov ax,900h
int 21h
mov ax,0a00h
mov dx,offset stringl
int 21h
call endline
mov bx,2h
xor ax,ax
cmp ds:[bx+stringl],'-' ;sprawdzenie czy b jest ujemne
mov dl,ds:[bx+stringl]
mov ds:[bx+kopiab-2h],dl
jne bez_znaku_b
inc znakb
inc bx
bez_znaku_b:
xor dh,dh
mov dl,ds:[bx+stringl]
mov ds:[bx+kopiab-2h],dl
cmp dl,0dh
je niekoniec
dalejb:
cmp dl,30h ;sprawdza czy znak jest cyfra
jb zlyformatb
cmp dl,39h
ja zlyformatb
sub dl,30h
push dx
call mulintb
pop dx
add word ptr ds:[intb],dx ;przeksztalca znak na liczbe
inc bx
jmp bez_znaku_b
niekoniec:
mov ds:[bx+kopiab-2h],'$' ;kopiuje b do kopiab
cmp word ptr ds:[inta],0h ;sprawdza czy a<>0
je koniec
jestm0:
call mulintb ;zwieksza dokladnosc
call mulintb
call mulintb
mov cx,10h
xor dx,dx
mov ax,word ptr ds:[intb]
mov cx,word ptr ds:[inta]
div cx
mov word ptr ds:[wynik],ax
mov word ptr ds:[reszta],dx
koniec:
cmp word ptr ds:[inta],0h ;sprawdza, czy byly miejsca zerowe do wyswietlenia
jne moznapisac
cmp word ptr ds:[intb],0h
jne niemamiejsc0
mov ax,900h
mov dx,offset infmo
int 21h
jmp wykres
niemamiejsc0:
mov ax,900h
mov dx,offset nomo
int 21h
jmp wykres
moznapisac:
cmp word ptr ds:[wynik],0h
jne niezerowynik
niezerowynik:
mov al,ds:[znaka] ;wypisuje znak wyniku
mov ah,ds:[znakb]
xor al,ah
cmp al,0h
mov ax,900h
mov dx,offset moto
jne plus
mov ax,200h
mov dl,'-'
mov ds:[kopiaw],'-'
inc ds:[wptr]
int 21h
plus:
;wywoluje funkcje wyswietldec32 do wyswietlenia wyniku
mov bx,word ptr ds:[wynik]
mov cl,ds:[mantyw]
call wyswietldec32
call endline
wykres: ;przygotowuje wykres
mov cx,14h
mov bx,1fh
add bx,3h
endline: ;wyswietla nowa linie
push ax
push dx
mov ax,200h
mov dl,0dh
int 21h
mov ax,200h
mov dl,0ah
int 21h
pop dx
pop ax
ret
mulinta: ;mnozy a razy dziesiec
push ax
push cx
xor dx,dx
mov ax,word ptr ds:[inta]
mov cx,0ah
mul cx
mov word ptr ds:[inta],ax
add ax,dx
pop cx
pop ax
ret
zlyformata: ;wyswietla blad, gdy a jest w zlym formacie
mov ax,900h
mov dx,offset blad1
int 21h
jmp zacznija
mulintb:
push ax ;mnozy b razy dziesiec
push cx
xor dx,dx
mov ax,word ptr ds:[intb]
mov cx,0ah
mul cx
mov word ptr ds:[intb],ax
add ax,dx
pop cx
pop ax
ret
zlyformatb: ;wyswietla blad jezeli b jest w zlym formacie
mov ax,900h
mov dx,offset blad1
int 21h
jmp zacznijb
code1 ends
data1 segment
punkty db 693 dup(' ') ;tablica punktow
niezer db 1 dup(0) ;zmienna pomocnicza funkcji wyswietlajacej
kopiab db 24 dup('$') ;zmienna przechowujaca b jako stringa
kopiaw db 24 dup('$') ;zmienna przechowujaca w jako stringa
wptr db 1 dup(0) ;zmienna pomocnicza przy zapisywaniu wartosci do kopia
isprze db 1 dup(0) ;zmienna pomocnicza do wyswietlania
znaka db 1 dup(0) ;znak wartosci a
mantya db 1 dup(0) ;mantysa wartosci a
inta dd 1 dup(0) ;wartosc a
znakb db 1 dup(0) ;znak wartosci b
mantyb db 1 dup(0) ;mantysa wartosci b
intb dd 1 dup(0) ;wartosc b
stringl db 24 dup('$') ;zmienna przechowujaca stringa podanego przez uzytkowanika
czytint db 1 dup(0) ;zmienna okreslajaca, czy czytana jest czesc przed czy po przecinku
pomnoz dd 1 dup(0) ;zmienna pomocnicza dzielenia "pisemnego"
wynik dd 1 dup(0) ;zmienna przechowujaca wynik
mantyw db 1 dup(0) ;zmienna przechowujaca mantyse wyniku
reszta dd 1 dup(0) ;zmienna przechowujaca reszte
podaja db "Podaj wartosc wspolczynnika a: $" ;komunikaty programu
podajb db "Podaj wartosc wspolczynnika b: $"
moto db "Miejsce zerowe to:",13,10,'$'
nomo db "Nie ma miejsca zerowego",13,10,'$'
infmo db "Jest nieskonczenie wiele miejsc zerowych",13,10,'$'
blad1 db "To nie jest liczba!",13,10,'$'
data1 ends ;deklaracja stosu
stos1 segment STACK
dw 256 dup(?)
top1 dw ?
stos1 ends
end start