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