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
|