Asembler funkcja liniowa

0

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
0

Nie wiem jak wypisać wartość wynik ani czy ten program będzie działał.

Jak nie wiesz czy będzie działał to dlaczego go nie uruchomisz?

0

Program jest bardzo nieczytelnie napisany. Poświęciłem kilka minut na przejrzenie, i nadal nie wiem co to ma robić i gdzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1