Esta pagina se ve mejor con JavaScript habilitado

MercuryOS Pila

 ·  🎃 kr0m

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”.

vi boot_sect_stack.asm

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:

nasm -f bin boot_sect_stack.asm -o boot_sect_stack.bin

La cargamos en qemu:

qemu-system-x86_64 boot_sect_stack.bin

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.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí