org 100h

start:
; wyświetl wiadomość powitalną
mov	ah, 9
mov	dx, msg0
int	21h

mov	dx, enter1
int	21h

; pobierz ile liczb ma zostać pobranych (tu zawsze 2)
mov	ax, [liczb]
mov	[i], ax

; wczytuj i liczb
cinnum:
	mov	ah, 9
	mov	dx, msg1
	int	21h

	; przygotuj zmienne do wczytania liczby
	xor	ax, ax
	xor	cx, cx
	mov	[val], ax
	mov	bx, 10
	
	; wczytaj liczbę, przerwij po wciśnięciu ENTERa (znak 13)
	cinbeg:																																															
		mov	ah, 1
		int	21h
	cmp	al, 13	; jeśli enter to przerwij wczytywanie
	je	cinend
		mov	cl, al
		sub	cl, 48
		mov	ax, [val]
		xor	dx, dx
		mul	bx
		add	ax, cx
		mov	[val], ax
	jmp	cinbeg	; wróć do wczytania kolejnej liczby
	cinend:
	mov	ax, [val]
	push	ax	; przechowaj liczbę na stosie
	mov	ax, [i]
	dec	ax
	mov	[i], ax
cmp	ax, 0
ja	cinnum

; pokaż komunikat z prośbą o znak operacji
mov	ah, 9
mov	dx, msg2
int	21h

mov	ah, 1
int	21h
mov	dl, al

; pobierz odłożone na stos liczby
pop	bx	; kolejność jest ważna, ponieważ od tego zależy wynik odejmowania / dzielenia
pop	ax

; sprawdź znak jaki został wybrany i przejdź do odpowiedniej sekcji operatora
cmp	dl, 43
je	oadd
cmp	dl, 45
je	osub
cmp	dl, 42
je	omul
cmp	dl, 47
je	odiv
; jeśli znak nie zostanie znalezion to wypisz błąd
jmp	error

; sekcje operacji dla każdego z operatorów
oadd:
	add	ax, bx
	mov	[val], ax
	jmp	wypisz
osub:
	sub	ax, bx
	mov	[val], ax
	jmp	wypisz
omul:
	xor	dx, dx
	mul	bx
	mov	[val], ax
	jmp	wypisz
odiv:
	xor	dx, dx
	div	bx
	mov	[val], ax
	jmp 	wypisz

; wypisywanie wyniku
wypisz:
	; komunikat
	mov	ah, 9
	mov	dx, enter1
	int	21h

	mov	ah, 9
	mov	dx, msg3
	int	21h

	; przygotuj rejestry: ax - wartość do wypisania, cx - ile cyfr oraz bx - system liczby do wypisania
	mov	ax, [val]
	mov	cx, 0
	mov	bx, 10
	rcyfry:
		xor	dx, dx
		div	bx
		push	dx
		inc	cx
	cmp	ax, 0
	ja	rcyfry

	; wypisz cyfry odłożone na stos
	mov	ah, 2
	wcyfry:
		pop	dx
		add	dx, 48
		int	21h
	loop wcyfry

koniec:
mov	ax, 4C00h
int	21h

; wyświetlanie komunikatu o błędzie
error:
	mov	ah, 9
	mov	dx, enter1
	int	21h

	mov	dx, msge
	int	21h
jmp	koniec

; komunikaty
msg0	db	"- Podaj dwie liczby -$"
msg1	db	"Podaj liczbe: $"
msg2	db	"Podaj znak operacji: $"
msg3	db	"Wynik = $"
msge	db	"Bledne dane!$"
enter1	db	10,13,36
val	db	123	; przechowuje wynik
liczb	db	2	; ile liczb ma być wczytanych
i	db	0	; zmienna pomocnicza do monitorowania ile liczb wczytano
oper	db	0	; wybór operatora