06 stack

CPU 提供兩個指令 push 以及 pop,讓我們可以方便的塞東西進 stack 以及從 stack 拿東西出來。

在 16-bit mode 中,我們要以 16 bit 為單位 push / pop 東西至 stack。

stack 由兩個特殊的 register 實作:bpsp。它們分別記錄 stack 的 base(stack 底部)以及 stack top。

stack 長的方向不是「往上」(memory address 增加),而是「往下」(memory address 減少)。也就是如果我們一開始將 stack base 設在 0x8000,push 一個值後,sp 會是 0x8000 - 0x2 = 0x7ffe。之所以是減 0x2 是因為一次 push 的 element 的大小是 16 bit。

由下面的例子可以確認 stack 的增長方向是往 memory address 小的地方:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mov ah, 0x0e

mov bp, 0x8000 ; setup stack base to 0x8000
mov sp, bp ; setup stack top

push 'A'
push 'B'
push 'C'

pop bx ; element size is 16 bit, so use bx
mov al, bl
int 0x10 ; print 'C'

mov al, [0x7ffe]
int 0x10 ; print 'A'

mov al, [0x7ffc]
int 0x10 ; print 'B'

jmp $

times 510-($-$$) db 0
dw 0xaa55

中間 pop 之所以要先 pop 至 bx 再從 bl 中拿值放到 al 印出,是因為 pop 出來的 size 是 16 bit,而其中有內容(字元的 ASCII code)是低位的部份,高位部份會是 0。