棧是一種只能在一端進行插入或者刪除操作的數據結構(比如彈夾,最后壓入的子彈最先別射出)
現今的cpu都有棧的設計,以<span style="color:red">**字**</span>為單位
字通常分為若干個字節(每個字節一般是8bit)。
在存儲器中,通常每個單元存儲一個字。因此每個字都是可以尋址的。
字的長度用位數來表示, 32位系統則32位為一個字,64位系統以64位為1個字,這里討論的的8086為16位為一個字
>[info]入棧:push 將會一個新的元素放到棧頂
出棧:pop 從棧頂取出一個元素
特征: 后進先出

賦值0123H給cpu寄存器ax,然后通過push ax 將指針指向棧頂最后將寄存器中的值壓入內存中
上面的例子是將1000H作為棧使用的那么:
1、CPU如何知道一段內存空間被當作棧使用?
8086CPU中,有兩個與棧相關的寄存器:
* 棧段寄存器SS:存放棧頂的段地址
* 棧頂指針寄存器SP:存放棧頂的偏移
2、執行push和pop的時候,如何知道哪個單元是棧頂單元?
任意時刻, SS:SP指向棧頂元素。
**例子:**
將10000H~10001H-1(1000FH)這段空間作為棧
```
mov ax,1000H
//棧段地址設為1000H
mov ss,ax
//將棧頂指針設為0010H
mov sp,0010H
```
8086是16位一個字(一個字等于一個存儲單元),棧操作的是字

```
mov ax,001AH
mov bx,001BH
push ax
puh bx
```


```
pop ax
pop bx
```
注意AX與BX發生了交換 ,此時 ax=001BH bx=001AH

## **超界問題**
執行入棧(push)時,棧頂會超出棧空間
執行出棧(pop)時,棧頂也會超出棧空間
8086CPU不保證對棧的操作不會超界:
8086CPU只知道棧頂在何處(由SS:SP指示),不知道程序安排的棧空間有多大。
我們在編程的時候要自己操心棧頂超界的問題,要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的數據太多而導致的超界;防止出棧時棧空了仍然繼續出棧而導致的超界。