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í