第三章 第五節

2021-06-02 21:51:53 字數 1373 閱讀 1757

pop ax 指令的執行過程

(1)將ss:sp指向的記憶體單元處的資料送入ax中。

(2)sp = sp + 2,ss:sp指向當前棧頂下面的單元,以當前棧頂下面的單元為新的棧頂。

注意:1、出棧後,ss:sp指向新的棧頂,1000eh,pop操作前的棧頂元素,1000ch處的2266h依然存在,但是,它已經不在棧中。

2、當再次執行push入棧指令後,ss:sp移至1000ch,並在裡面寫入新的資料,它將被覆蓋。

《棧頂超界的問題》

ss和sp只記錄了棧頂的位址,依靠ss和sp可以保證在入棧和出棧時找到棧頂,可是,如何保證在入棧和出棧時,棧頂不會超出棧空間呢?

當棧滿的時候再使用push指令入棧或當棧空的時候再使用pop指令出棧,都將發生棧頂超界問題。

當棧滿的時候再使用push指令入棧:

當棧空的時候再使用pop指令出棧:

棧頂超界是危險的:

因為我們既然將一段空間安排為棧,那麼在棧空間之外的空間裡很可能存放了具有其他用途的資料、**等,這些資料、**可能是我們自己的程式中的,也可能是別的程式中的(畢竟乙個計算機系統並不是只有我們自己的程式在執行),但是由於我們在入棧出棧時的不小心而將這些資料、**意外的改寫,將會引發一連串的錯誤(但如果是可以的……那麼……呵呵……)

我們當然希望cpu可以幫我們解決這個問題,實際情況是8086cpu中並沒有棧的越界檢查。

結論:我們在程式設計的時候要自己操心棧頂超界的問題(向上超界和向下超界),要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的資料太多而導致的超界;

執行出棧操作的時候也要注意,以防棧空的時候繼續出棧而導致的超界。

push和pop指令時可以在暫存器和記憶體之間傳送資料的。

push和pop指令的格式:

棧空間當然也是記憶體空間的一部分,它只是一段可以以一種特殊的方式進行訪問的記憶體空間。

push和pop指令的格式(1)

push  暫存器:將乙個暫存器中的資料入棧。

pop    暫存器:用乙個暫存器接收出棧的資料。

例如:push ax

pop   bx

push和pop指令的格式(2)

push  段暫存器:將乙個段暫存器中的資料入棧。

pop    段暫存器:用乙個段暫存器接收出棧的資料。

例如:push  ds

pop     es

push和pop指令的格式(3)

push  記憶體單元:將乙個記憶體單元處的字入棧(棧操作都是以字為單位)

pop    記憶體單元:用乙個記憶體字單元接收出棧的資料

例如:push  [0]

pop    [2]

指令執行時,cpu要知道記憶體單元的位址,可以在push、pop指令中給出記憶體單元的偏移位址,段位址在指令執行時,cpu從ds中取得。

第三章 第五節 集合

集合是乙個無需不重複的序列,用set來表示 零 建立集合 建立集合的方式有兩種,分別是 和set 下面我們來具體講解一下。形式 形式用來建立乙個非空集合,語法如下 set 下面我們通過例子來看一下具體怎麼使用 例子 一 定義乙個包含字串的集合 name 例子 二 定義乙個包含多種型別的集合 pers...

第三章第五節 相似 仿射 射影變換

引言 除了歐式變換,空間中還有其他的變換,只不過歐式變換是最簡單的變換,他不改變物體的形狀,而其他的變換則會改變物體的外形。和歐式變換相似,其他變換均有類似的矩陣表示。變換性質 相似變換在歐式變換的基礎上多了乙個自由度,為7自由度,允許物體進行均勻縮放。相似變換矩陣tsts t s srt 0t1 ...

php原始碼之路第三章第五節( 型別提示的實現)

php是弱型別語言,向方法傳遞引數時候也並不嚴格檢查資料型別。不過有時需要判斷傳遞到方法中的引數,為此php中提供了一些函式,來判斷資料的型別。比如is numeric 判斷是否是乙個數值或者可轉換為數值的字串,比如用於判斷物件的型別運算子 instanceof。instanceof 用來測定乙個給...