mirror of
https://github.com/cfenollosa/os-tutorial.git
synced 2024-10-27 20:34:19 +00:00
lesson 4, manipulating the stack
This commit is contained in:
parent
0522ad727e
commit
dde61c13e7
13
04-bootsector-stack/README.md
Normal file
13
04-bootsector-stack/README.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
*Concepts you may want to Google beforehand:stack*
|
||||||
|
|
||||||
|
The usage of the stack is important, so we'll write yet another boot sector
|
||||||
|
with an example.
|
||||||
|
|
||||||
|
Remember that the `bp` register stores the base address (i.e. bottom) of the stack,
|
||||||
|
and `sp` stores the top, and that the stack grows downwards from `bp` (i.e. `sp` gets
|
||||||
|
decremented)
|
||||||
|
|
||||||
|
This lesson is quite straightforward, so jump ahead to the code.
|
||||||
|
|
||||||
|
I suggest that you try accessing in-stack memory addresses by yourself,
|
||||||
|
at different points in the code, and see what happens.
|
42
04-bootsector-stack/boot_sect_stack.asm
Normal file
42
04-bootsector-stack/boot_sect_stack.asm
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
mov ah, 0x0e
|
||||||
|
|
||||||
|
mov bp, 0x8000 ; this is an address far away from 0x7c00 so that we don't get overwritten
|
||||||
|
mov sp, bp
|
||||||
|
|
||||||
|
push 'A'
|
||||||
|
push 'B'
|
||||||
|
push 'C'
|
||||||
|
|
||||||
|
; to show how the stack grows downwards
|
||||||
|
mov al, [0x7ffe] ; 0x8000 - 2
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
; however, don't try to access [0x8000] now, because it won't work
|
||||||
|
; you can only access the stack top so, at this point, only 0x7ffe (look above)
|
||||||
|
mov al, [0x8000]
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
|
||||||
|
; recover our characters using the standard procedure: 'pop'
|
||||||
|
; We can only pop full words so we need an auxiliary register to manipulate
|
||||||
|
; the lower byte
|
||||||
|
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
|
||||||
|
|
||||||
|
; data that has been pop'd from the stack is garbage now
|
||||||
|
mov al, [0x8000]
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
|
||||||
|
jmp $
|
||||||
|
times 510-($-$$) db 0
|
||||||
|
dw 0xaa55
|
Loading…
Reference in New Issue
Block a user