棧有兩個基本的操作:入棧和出棧
入棧:將乙個新的元素放到棧頂
出棧:從棧頂取出乙個元素
棧頂的元素總是最**棧,需要出棧時,又最先被從棧中取出。
棧的操作規則:lifo
8086cpu提供相關的指令來以棧的方式訪問記憶體空間。
入棧出棧指令:
push(入棧)pop(出棧)
push ax 將暫存器ax中的資料送入棧中;
pop ax 從棧頂取出資料送入ax
均是以字為單位進行的。
字型資料用兩個單元存放,高位址單元放高8位,低位址單元放低8位。
段暫存器ss 存放棧頂的段位址
暫存器sp 存放棧頂的偏移位址
任意時刻,ss:sp指向棧頂元素
push ax
1 sp=sp-2
2 將ax中的內容送入ss:sp指向的記憶體單元,ss:sp此時指向新棧頂。
當棧是空時,它指標會指向當前棧的最高位址的下一位址。
任意時刻,ss:sp指向棧頂元素,當棧為空的時候,棧中沒有元素,也就不存在棧頂元素。
所以ss:sp只能指向棧的最底部單元下面的單元,該單元的偏移位址為棧最底部的字單元的偏移位址+2
8086cpu的互作機理,只考慮當前的情況:
當前棧頂在何處
當前要執行的指令是哪一條。
將10000h-1000fh這段空間當作棧,初始狀態是空的,將ax,bx,ds中的資料入棧
抹空操作
不用mov來實現寫入操作
mov ax,1000hpush pop實質上就是一種記憶體傳送指令,可以在暫存器和記憶體之間傳送資料,與mov指令不同的是,push和pop指令訪問的記憶體單元的位址不是在指令中給出的,而是由ss:sp指定的。mov ss,ax
mov sp,
2mov ax,2255h
push ax
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;如果再次壓棧,棧頂將環繞,覆蓋了原來的內容。
posted @
2013-02-16 20:07
xingoo 閱讀(
...)
編輯收藏
組合語言 手記4
簡單的彙編指令 cpu執行後,暫存器中的資料改變為如下 cpu訪問記憶體單元時要給出記憶體單元的位址。所有的記憶體單元構成的儲存空間是乙個一維的線性空間。這個唯一的位址就是實體地址。16位結構描述了乙個cpu具有一下幾個方面特徵 1 運算器一次最多可以處理16位的資料。2 暫存器的最大寬度為16位。...
組合語言 手記7
cpu要讀取乙個記憶體單元的時候,必須先給出這個記憶體單元的位址 在8086pc中,記憶體位址由段位址和偏移位址組成。8086cpu中有乙個ds暫存器,通常用來存放要訪問的資料的段位址。mov al,0 mov已知的功能 1 將資料直接送入暫存器 2 將乙個暫存器中的內容送入另乙個暫存器中。3 將乙...
組合語言 手記2
彙編由以下3類組成 1 彙編指令 機器碼的助記符 2 偽指令 由編譯器執行 3 其他符號 由編譯器識別 組合語言的核心是彙編指令,它決定了組合語言的特性 cpu是計算機的核心部件,它控制整個計算機的運作並進行運算,要想讓乙個cpu工作,就必須提供指令和資料。指令和資料在儲存器中存放,也就是平時所說的...