La CPU es capaz de almacenar información en los registros pero esto nos limita mucho en cuanto a tamaño, para solventar este problema utilizamos la memoria principal(RAM). Para leer/escribir algún dato en RAM necesitamos conocer la dirección de memoria en cuestión, como esto puede ser engorroso se ideó la pila, esta no es mas que una región de memoria donde se pueden ir apilando datos para posteriormente ir desapilándolos.
Antes de comenzar es recomendable que leas estos artículos anteriores:
La CPU posee dos instrucciones para acceder a la pila estas son push/pop, cumplen con las funciones de apilar y desapilar datos respectivamente.
Podemos apilar y desapilar pero todavía no sabemos donde, mediante los registros bp/sp conoceremos las direcciones de memoria de la base y la cima de la pila.
Algo muy importante es que la pila crece hacia las direcciones de memoria inferiores, si apilamos un dato esté quedará almacenado en la RAM en la dirección bp hasta sp = bp-size.
En el siguiente programa vamos a “pushear” varios valores para posteriormente “popearlos”.
mov ah, 0x0e ; tty mode
mov bp, 0x8000 ; this is an address far away from 0x7c00 so that we don't get overwritten
mov sp, bp ; if the stack is empty then sp points to bp
push 'A'
push 'B'
push 'C'
; recover our characters using the standard procedure: 'pop'
; We can only pop full words, but int10 uses al register
; so we need an auxiliary register to copy data to al
pop bx
mov al, bl
int 0x10 ; prints C
pop bx
mov al, bl
int 0x10 ; prints B
pop bx
mov al, bl
int 0x10 ; prints A
jmp $
times 510-($-$$) db 0
dw 0xaa55
Generamos la imagen:
La cargamos en qemu:
SeaBIOS (version rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org)
iPXE (http://ipxe.org) 00:03.0 C980 PCI2.10 PnP PMM+07F91410+07EF1410 C980
Booting from Hard Disk...
CBA
Como podemos ver los valores se han ido desapilando en orden inverso a su inserción, tal como debe ser. Alguien podría pensar que el registro bp no aporta ningún valor ya que teniendo sp podemos apilar y desapilar y es cierto pero no podríamos leer los valores de las variables de la función ya que para acceder a estas se calcula su dirección en base a la bs.