Witam,

Mam do zrobienia programik wczytujacy 2 liczby z zakresu [-32768-32767] nastepnie wczytana liczbe przerabia z ASCII na kod U2
dodaje do siebie liczby, znowu przerabia na ASCII i wyswietla. Wiekszosc jest zrobiona, dodawanie dziala, dla liczb ujemnych i dodatnich sprawdzalem po kodach ascii, niestety za nic nie moge zmusic go do wyswietlenia wyniku ktory jest ujemny oraz niektore wyniki dodatnie tez zle liczy cos jest dziwne.

Siedze juz na tym 2 dni i stanalem w miejscu, wiec prosze o pomoc

Z gory dziekuje

.MODEL  TINY

        MAX_ZNAKOW              EQU     5	; maksymalna liczba znakow
                                                ; liczby wprowadzanej przez
                                                ; uzytkownika
        CRLF                    EQU     13,10   ; znak nowej linii
		
WczytajZnak     MACRO

                mov     ah, 08h
                int     21h
                ENDM

WyswietlZnak    MACRO   Znak

                mov     dl, Znak
                mov     ah, 02h
                int     21h
                ENDM

WyswietlNapis   MACRO   Napis

                mov     dx, OFFSET Napis
                mov     ah, 09h
                int     21h
                ENDM

Kod				SEGMENT
			
			ORG		100h
			ASSUME	CS:KOD, DS:KOD
			
Sumuj MACRO s1, s2, sm

		mov		word ptr sm, 0
		mov		word ptr sm+1, 0
		mov		ah, byte ptr s1
		mov		dh, byte ptr s2
		add		ah, dh
		mov		byte ptr sm, ah
		mov		ah, byte ptr s1+1
		mov		dh, byte ptr s2+1
		add		ah, dh
		mov		byte ptr sm+1, ah
		
		ENDM
			
Start:

jmp				Instrukcje

Skladnik1       DW      (?), '$'
Skladnik2       DW      (?), '$'
Suma            DD      (?), '$'
TMPSkl1			DW		(?)
TMPSkl2			DW		(?)
BuforTekstu     DB      ?, ?, ?, ?, ?, '$'
txtPowitanie    DB      "Program sumuje dwie liczby calkowite z zakresu "
                DB      "[-32768..32767].$"
txtZlec1        DB      CRLF,"Podaj pierwsza liczbe: $"
txtZlec2        DB      CRLF,"Podaj druga liczbe: $"
txtWynik        DB      CRLF,"Wynik wynosi: $"
txtBlad			DB		CRLF,"Przekroczono zakres.$"
Ujemna			DB		?
Zakres			DB		?

Konwertuj PROC NEAR
		xor		dx, dx
		xor		ch, ch
		mov		Zakres, ch
		mov		WORD PTR TMPSkl1 + 2, dx

Przygotuj:
		mov		al, [bx]
		inc		bx
		cmp		al, '$'
		je		Znak

		sub		al, '0'
		mov		cl, al
		mov		ax, dx
		mov		dx, 000Ah
		mul		dx
		add		ax, cx

		cmp		dx, 0000h
		jne		Blad
		cmp		ax, 8000h
		jb		Dalej
		je		Sprawdz

Blad:
		mov		al, 01h
		mov		Zakres, al
		xor		dx, dx
		jmp		KoniecKW

Dalej:
		mov		dx, ax
		jmp		Przygotuj

Sprawdz:
		cmp		dl, Ujemna
		je		Blad
		jmp		Dalej

Znak:
		xor		al, al
		cmp		al, Ujemna
		je		KoniecKW
		cmp		dx, 0000h
		je		KoniecKW
		sub		dx, 0001h
		xor		dx, 0FFFFh
		mov		WORD PTR TMPSkl1 + 2, 0FFFFh

KoniecKW:
		; w dx oraz w poczatkowych 16 bitach znajdzie sie 16-bitowa
		; postac obliczeniowa U2 (bity 16-32 zmiennej liczba zostaly
		; juz ustawione)
		mov		WORD PTR TMPSkl1, dx
		ret
ENDP

WczytajLiczbe   PROC NEAR

				mov		Ujemna, 0		
				WczytajZnak		
				cmp		al,	'-'
				jne		Wczytaj
				mov		Ujemna, 1
				WyswietlZnak al
				
				
Wczytaj:
                WczytajZnak     ; wczytaj znak bez echa
				cmp		al, 0Ah
				je		Koniec
				cmp		al, 0Dh
				je		Koniec
                cmp     al, '0' ; czy znak jest cyfra?
                jb      Wczytaj ; nie - ignoruj znak i przejdz do wczytania kolejnego
                cmp     al, '9'
                ja      Wczytaj
                mov     [bx], al        ; tak - zapamietaj znak w buforze
                inc     bx              ; zwieksz pozycje wskaznika w buforze
                WyswietlZnak al         ; wyswietl wczytany znak
                loop    Wczytaj
				

Koniec:
		mov		al, '$'
		mov		[bx], al
                ret
				
WczytajLiczbe   ENDP

Zeruj PROC NEAR
		mov		cx, MAX_ZNAKOW
		xor		al, al
PetlaZerowania:
		mov		[bx], al
		inc		bx
		loop		PetlaZerowania
		ret
ENDP

PROC Wypisz NEAR
		mov		ax, WORD PTR suma
		mov		cx, WORD PTR suma + 2
		cmp		ch, 80h
		jb		Dodatnia
		cmp		ax, 0000h
		jne		Ok
		sub		cx, 0001h
Ok:
		sub		ax, 0001h
		xor		cx, 0FFFFh
		xor		ax, 0FFFFh
		mov		dl, '-'
		mov		bx, ax
		WyswietlZnak dl
		mov		ax, bx
Dodatnia:
		mov		bx, OFFSET buforTekstu
		add		bx, 04h
		mov		dx, cx
PetlaWL:
		mov		cx, 10
		div		cx
		mov		[bx], dl
		xor		dx, dx
		dec		bx
		cmp		ax, 0000h
		jne		PetlaWL

Wypisywanie:
		inc		bx
		mov		dl, [bx]
		cmp		dl, '$'
		je		KoniecWL
		add		dl, '0'
		WyswietlZnak dl
		jmp		Wypisywanie

KoniecWL:	
		ret
ENDP

Instrukcje:

			WyswietlNapis	txtPowitanie
			WyswietlNapis	txtZlec1
			mov		bx, OFFSET BuforTekstu
			mov		cx, MAX_ZNAKOW
			call	WczytajLiczbe
			mov		bx, OFFSET BuforTekstu
			call	Konwertuj
	
			cmp		Zakres, 1
			je		Wyjdz
			
			mov		Skladnik1, dx
			mov		bx, OFFSET BuforTekstu
			call	Zeruj
			
			
			WyswietlNapis	txtZlec2
			mov		bx, OFFSET BuforTekstu
			mov		cx, MAX_ZNAKOW
			call	WczytajLiczbe
			mov		bx, OFFSET BuforTekstu
			call	Konwertuj

			
			cmp		Zakres, 1
			je		Wyjdz
			
			mov		Skladnik2, dx
			
			
			Sumuj	Skladnik1, Skladnik2, Suma
			WyswietlNapis Suma
			WyswietlNapis txtWynik
			call Wypisz
			
			mov		ax, 4C00h
			int		21h

Wyjdz:
			WyswietlNapis	txtBlad
			mov		ax, 4C00H
			int		21h
			


				

Kod             ENDS

                END     Start