org 100h

start:
	; zapamiętaj wierzchołek stosu
	mov	[stack], sp
	; zarezerwuj 11 słow czyli 22 bajty
	sub	sp, 22
	
	; ustaw, które dane zmodyfikować
	mov ax, 0
	mov	[przes], ax
	mov ax, 187
	mov	[znak], ax
	mov ax, 11
	mov	[ile], ax
	; ustaw 11 wartości na 187
	call	ustawk
	
	; ustaw pierwsze 6 wartości na 250
	mov ax, [el1]
	mov	[znak], ax
	mov ax, 6
	mov	[ile], ax
	call	ustawk
	
	; wypisz pierwsze 6 wartości
	mov ax, 0
	mov	[przes], ax
	mov ax, 6
	mov	[ile], ax
	call	wypiszb
	
	; przejdź do następnej linii
	mov	ah, 9
	mov	dx, ent1
	int	21h
	
	; ustaw kolejne 5 wartości na 255
	mov ax, 6
	mov	[przes], ax
	mov ax, [el2]
	mov	[znak], ax
	mov ax, 5
	mov	[ile], ax
	call	ustawk
	
	; wypisz kolejne 5 wartości
	mov ax, 6
	mov	[przes], ax
	mov ax, 5
	mov	[ile], ax
	call	wypiszb
	
	; przejdź do następnej linii
	mov	ah, 9
	mov	dx, ent1
	int	21h
	
	; wypisz wszystkie 11 ustawionych elementów
	mov ax, 0
	mov	[przes], ax
	mov ax, 11
	mov	[ile], ax
	call	wypiszb
	
	; przywróć pierwotny wierzchołek stosu
	mov	sp, [stack]
koniec:
	mov	ax, 4C00h
	int	21h

; ustawia [ile] słów na stosie począwszy od pozycji [przes]
ustawk:
	mov di, [stack]	; pobierz pozycję pierwszego słowa na stosie
	; przesuń wskaźnik di o odpowiednią ilość słów
	mov cx, [przes]
	mov	ch, 0
	ustawk0:
		sub	di, 2
	loop ustawk0
	; ustaw [ile] wyrazów na [znak]
	mov	cx, [ile]
	mov	bx, [znak]
	ustawk1:
		mov	[di], bx	; ustaw aktualnie wskazywany element
		sub	di, 2	; przejdź do następnego słowa
	loop ustawk1
ret

; pierwszy sposób wypisywania, korzystając tylko z rejestru DI
wypisz:
	mov di, [stack]
	mov cx, [przes]
	mov ch, 0
	wypisz0:
		sub	di, 2
	loop wypisz0
	mov	cx, [ile]
	mov	ah, 2
	wypisz1:
		mov	dx, [di]
		mov	dh, 0
		int 21h
		sub	di, 2
	loop wypisz1
ret

; drugi sposób wypisania, korzystając z [zmienna + DI], tu: [bx + DI]
wypiszb:
	; BX musi pozostać niezmienne, po kolejnych elementach przechodzimy rejestrem DI
	mov bx, [stack]
	mov	di, 0
	; wyznacz koniec tablicy dynamicznej ([przes] + [ile])*2 elementów od wierzchołka stosu
	; wyznacz przesunięcie do pierwszego elementu [ile]*2
	mov	cx, [przes]
	wypiszb0:
		sub	bx, 2
	loop wypiszb0
	mov	cx, [ile]
	wypiszb1:
		sub	bx, 2
		add	di, 2
	loop wypiszb1
	; wypisz kolejne elementy
	mov	cx, [ile]
	mov	ah, 2
	wypiszb2:
		mov	dx, [bx + di]
		mov	dh, 0
		int 21h
		sub	di, 2
	loop wypiszb2
ret

ent1	db	10,13,'$'	; enter
stack	dw	0	; do zapamiętania oryginalnego wierzchołku stosu
el1	dw	250
el2	dw 255
przes	dw	0	; od którego elementu wypisujemy
znak	dw	0	; jaki znak chcemy ustawić
ile	dw	0	; ile kolejnych elementów ma zostać ustawionych / wypisanych