06 stack
CPU 提供兩個指令 push
以及 pop
,讓我們可以方便的塞東西進 stack 以及從 stack 拿東西出來。
在 16-bit mode 中,我們要以 16 bit 為單位 push / pop 東西至 stack。
stack 由兩個特殊的 register 實作:bp
與 sp
。它們分別記錄 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 | mov ah, 0x0e |
中間 pop 之所以要先 pop 至 bx
再從 bl
中拿值放到 al
印出,是因為 pop 出來的 size 是 16 bit,而其中有內容(字元的 ASCII code)是低位的部份,高位部份會是 0。