彙編語言 手記8

棧有兩個基本的操做:入棧和出棧spa

入棧:將一個新的元素放到棧頂指針

出棧:從棧頂取出一個元素code

 

棧頂的元素老是最後入棧,須要出棧時,又最早被從棧中取出。blog

 

棧的操做規則:LIFO內存

 

8086CPU提供相關的指令來以棧的方式訪問內存空間。class

入棧出棧指令:im

PUSH(入棧)POP(出棧)數據

push ax   將寄存器ax中的數據送入棧中;img

pop ax   從棧頂取出數據送入axdi

均是以爲單位進行的。

 

字型數據用兩個單元存放,高地址單元放高8位,低地址單元放低8位。

 

段寄存器SS 存放棧頂的段地址

寄存器SP 存放棧頂的偏移地址

任意時刻,SS:SP指向棧頂元素

 

push ax

1 sp=sp-2

2 將ax中的內容送入SS:SP指向的內存單元,SS:SP此時指向新棧頂。

當棧是空時,它指針會指向當前棧的最高地址的下一地址。

 

任意時刻,SS:SP指向棧頂元素,當棧爲空的時候,棧中沒有元素,也就不存在棧頂元素。

因此SS:SP只能指向棧的最底部單元下面的單元,該單元的偏移地址爲棧最底部的字單元的偏移地址+2

棧最底部字單元的地址爲1000:000E,因此棧空時,SP=0010H。

 

8086CPU的互做機理,只考慮當前的狀況:

當前棧頂在何處

當前要執行的指令是哪一條。

 

將10000H-1000FH這段空間看成棧,初始狀態是空的,將AX,BX,DS中的數據入棧

抹空操做

不用mov來實現寫入操做

mov ax,1000H mov ss,ax mov sp,2 mov ax,2255H push ax

 

push pop實質上就是一種內存傳送指令,能夠在寄存器和內存之間傳送數據,與mov指令不一樣的是,push和pop指令訪問的內存單元的地址不是在指令中給出的,而是由SS:SP指定的。

push pop和mov不一樣的是,mov只須要一步傳送;而push pop指令卻須要兩步操做。

執行push時:先改變sp,後向ss:sp處傳送

執行pop時:現讀取ss:sp數據,後改變sp.

 

任什麼時候刻ss:sp指向棧頂元素

8086只記錄棧頂,佔空間的大小要本身管理

 

若是內存從10000H-1FFFF,描述棧爲空時:

任意時刻,SS:SP指向棧頂元素,當棧爲空的時候,棧中沒有元素,也就不存在棧頂元素,因此SS:SP只能指向棧的最底部單元下面的單元,該單元的偏移地址爲棧最底部的字單元的偏移地址+2,棧最底部字單元的地址爲1000:FFFE,因此棧空時,SP=0000H

 

CPU都是16爲傳送數據的,N<=64K.從棧操做指令所完成的功能的角度上來看,push pop等指令在執行的時候只修改SP.因此棧頂的變化範圍是 0-FFFFH,從棧空時候的SP=0,一直壓棧,直到棧滿時SP=0;若是再次壓棧,棧頂將環繞,覆蓋了原來的內容。

相關文章
相關標籤/搜索