abc Asembler - elektronski priručnik
XVII dio Procedure

Stek kao struktura podataka

Stek je struktura podataka u memoriji slična nizu u koju podaci mogu biti spremljeni i iz nje uklonjeni sa lokacije koja se naziva 'vrh' (top) steka. Podaci koji trebaju biti spremljeni se 'guraju' (push) u stek, a podaci koje treba dobiti se 'vade' (pop) iz steka. Stek je LIFO (Last In First Out) struktura podataka, tj., podaci koji su spremljeni prvi se dobijaju posljednji.
Asemblerski jezik obezbjeđuje 2 instrukcije za operacije sa stekom: PUSH i POP. Ove instrukcije imaju sljedeću sintaksu:

PUSH   operand
POP     address/register

Memorijski prostor rezervisan u stek segmentu se koristi za implementiranje steka. Registri SS i ESP (ili SP) se koriste za implementiranje steka. Vrh steka, koji pokazuje na posljednji podatak ubačen u stek je pokazan od strane SS:ESP registra, gdje SS registar pokazuje na početak stek segmenta, a SP (ili ESP) daje offset u stek segmentu.
Implementacija steka ima sljedeće karakteristike:

  • Samo word ili doubleword može biti sačuvan u steku, ne i bajt.
  • Stek raste u obrnutom smjeru, tj., prema nižoj memorijskoj adresi.
  • Vrh steka pokazuje na posljednju stavku ubačenu u stek; on pokazuje na niži bajt posljednjeg ubačenog word-a.

Kao što je rečeno o spremanju vrijednosti registara u stek prije njihove upotrebe za neku svrhu; to se može učiniti na sljedeći način:

; Save the AX and BX registers in the stack
PUSH   AX
PUSH   BX
; Use the registers for other purpose
MOV    AX,  VALUE1
MOV    BX,  VALUE2
...
MOV    VALUE1,  AX
MOV    VALUE2,  BX
; Restore the original values
POP    AX
POP    BX

Primjer
Sljedeći program prikazuje čitav ASCII set karaktera. Glavni program poziva proceduru imena display, koja prikazuje ASCII set karaktera.

section   .text
      global _start 	    ;must be declared for using gcc
_start: 			        ;tell linker entry point
        call  display
        mov   eax,  1    	;system call number (sys_exit)
        int   0x80    	    ;call kernel
display:
        mov   ecx,  256
next:
        push  ecx
        mov   eax, 4
        mov   ebx, 1
        mov   ecx, achar
        mov   edx, 1
        int   80h
        pop   ecx
        mov   dx,  [achar]
        cmp   byte  [achar], 0dh
        inc   byte  [achar]
        loop  next
        ret
section   .data
achar  db  '0'

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:

0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
...
...

Procedure    <    Index    >    Rekurzija