35.棧:先進後出,涉及到入棧(PUSH)和出棧(POP)兩個概念.
a)push ax //表示将ax中的資料送入棧中
b)pop ax //表示從棧頂取出資料送入ax
36.8086CPU的入棧和出棧操作都是以字為機關進行的.那麼如何知道哪一段被當作棧在使用..?----How...?
PUSH和POP時,需要知道棧頂元素..?----How...?
和CS:IP類似,在8086CPU中,有兩個寄存器SS和寄存器SP,棧頂的段位址存放在ss中,偏移位址在sp中.
37.任意時刻,ss:sp指向棧頂元素 .PUSH和POP時,CPU從SS和SP中得到棧頂位址.
38.棧頂超界:和C語言中指針越界一樣,是很危險的操作,這個需要程式員自己控制.
39.PUSH和POP指令:PUSH和POP可以是如下格式的:
a)PUSH 寄存器
b)POP 寄存器 //将寄存器中的資料入棧或者将棧頂元素送到寄存器中
c)PUSH 段寄存器
d)POP 段寄存器 //同上
e)PUSH 記憶體單元
f)POP 記憶體單元 //同上
40.執行指令時,CPU要知道記憶體單元的位址,可以在PUSH,POP指令中隻給出記憶體單元的偏移位址,段位址在執行指令時,從SS處獲得.
設定棧的大小:
mov ax,1000H
mov ss,ax
mov sp,0010H //ss和sp的內插補點就是棧的大小了,由程式員自己控制
41.PUSH和POP與mov的差別是:兩次操作和一個操作的關系.
42.棧段:被定義當作棧的一段連續的位址空間.----Where...?設定SS和SP的值.
43.關于段的結論:可以将一段記憶體定義為一個段,用一個段位址訓示段,用偏移位址通路段的記憶體單元.-->自己設定.
用一個段存放資料,稱為資料段;
用一個段存放代碼,稱為代碼段;
用一個段存放棧,稱為棧段.
對于資料段,段的位址存放在DS中,用mov,add,sub等通路記憶體單元的指令時,CPU就是将我們定義的資料段中的内容當資料來通路;
對于代碼段,段的位址存放在CS中,将第一條指令的偏移位址放在IP中,CPU就會執行我們定義的代碼段中的指令;
對于棧段,段的位址放在SS中,将棧頂單元的偏移位址放在SP中,這樣CPU在進行棧操作時,就将我們定義的棧段當棧空間來使用.
44.是以,一段記憶體是什麼區域,扮演什麼角色,關鍵在于CPU中寄存器的設定,即CS,IP,SS,SP,DS的指向.