1. 程式人生 > >push/pop堆疊指令

push/pop堆疊指令

堆疊是儲存器中專用的緩衝區,用於暫存暫存器資料或地址指標,push/pop就用於堆疊的操作,這兩個指令一般用在: 1、子程式呼叫,為了保護現場,把所要用的暫存器中的內容先暫時儲存起來,在子程式呼叫結束之前,按照先進後出的原則,把資料恢復。 2、有時候,需要臨時用一下某些暫存器,也可用一下,憑個人喜好; 這兩個指令必須成對使用(特殊用途除外),你只要壓入了那些東西,並且知道他們的順序就行了,所操作的是字元還是資料,就不用知道了。 堆疊操作指令 堆疊是一個先進後出的主存區域,位於堆疊段中,使用SS段暫存器記錄器段地址。棧只有一個出口,即當前棧頂。棧頂是地址較小的一端(低端),它用堆疊指標暫存器SP指定。堆疊的兩種基本操作,對應兩條基本指令:

(1)、進棧指令push

push reg/mem/seg;sp<-sp-2,ss<-reg/mem/seg

進棧指令先使堆疊指令sp減2,然後把一個字運算元存入堆疊頂部。堆疊操作的物件只能是字運算元,進棧時底位元組存放於低地址,高位元組存放於高地址,sp相應向低地址移動兩個位元組單元。

push AX PUSH [2000H]
PUSH CS
(2)、出棧指令pop
pop reg/seg/mem;reg/seg/mem<-ss:[sp],sp<-sp+2
出棧指令把棧頂的一個字傳送至指定的目的運算元,然後堆疊指標sp加2。目的運算元應為字運算元,字從棧頂彈出時,低地址位元組送低位元組,高地址位元組送高位元組。

pop AX
POP [2000H]
POP SS堆疊可以用來臨時存放資料,以便隨時恢復它們。也常用於子程式見傳遞引數。
注意幾點:
(1)、因為堆疊指標sp總是指向已經存入資料的棧頂(不是空單元),所以PUSH指令是將(SP)減2,後將內容壓棧(即先修改SP是指指向空單元,後壓入資料),而POP是先從棧頂彈出一個字,後將堆疊指標SP加2.
(2)、PUSH CS是合法的,但是POP CS是不合法的。
(3)、因為SP總是指向棧頂,而用PUSH和POP指令存取數時都是在棧頂進行的,所以堆疊是先進後出或叫後進先出的。棧底在高地址,堆疊是從高地址向低地址延伸的,所有棧底就是最初的棧頂。
(4)、用PUSH指令和POP指令時只能按字訪問堆疊,不能按位元組訪問堆疊。

(5)、PUSH和POP指令都不影響標誌。

相關推薦

push/pop堆疊指令

堆疊是儲存器中專用的緩衝區,用於暫存暫存器資料或地址指標,push/pop就用於堆疊的操作,這兩個指令一般用在: 1、子程式呼叫,為了保護現場,把所要用的暫存器中的內容先暫時儲存起來,在子程式呼叫結束之前,按照先進後出的原則,把資料恢復。 2、有時候,需要臨時用一下某

2017-11-15 深刻理解堆疊PUSH POP指令

1、使用3種方式實現:pushecx mov ebx,0012ffc4 //棧頂 mov edx,0012ffe4  //棧底 sub ebx,4  mov dword ptr ds:[ebx],ecx  mov dword ptr ds:[ebx-4],ecx su

ionic2 頁面跳轉 push() pop() NavController,navParams

htm script mark int popup struct from navi lin 新建頁面http://zyyapp.com/post/185.html Ionic 2之頁面堆棧 :http://blog.csdn.net/u010730126/articl

redis push/pop(List)的17條命令

插入 ger com 1.3 解釋 不執行 時間 從表 方法 一、Blpop 命令移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。redis 127.0.0.1:6379> BLPOP LIST1 LIST2 ..

用單鏈表實現棧 Push,Pop時間為O(1)

pri 時間 int 實現一個棧 我們 來看 一個棧 list() linked 用單鏈表實現一個棧,要求Push Pop的運行時間為O(1),來自《算法導論》習題10.2-2。 因為Push和Pop操作伴隨著棧頂元素的插入和刪除,所以,這個問題的本質是:在單鏈表的哪個位

Vue push() pop() shift() unshift() splice() sort() reverse() ...

data con 最後一個元素 eve 條件 返回 授權 順序 檢查 Vue 變異方法 push() 方法可向數組的末尾添加一個或多個元素,並返回新的長度。 pop() 方法用於刪除並返回數組的最後一個元素。 shift() 方法用於把數組的第一個元素從其中刪除,並返回

第010課 彙編-add,sub,push,pop

add,sub push,pop 內容綱要 1.add,sub 2.push,pop 3.EFL 詳細內容 1.add,sub 加減法指令 (sub)add reg/m,reg/m/Im 當add m,m時,提示improper operand

淺談彙編(2)——堆疊指令

  現今的CPU中都有棧的設計。8086CPU提供相關的指令來以棧的方式訪問記憶體空間。這意味著,我們在基於8086CPU程式設計的時候,可以將一段記憶體當作棧來使用。 8086CPU提供入棧和出棧指令: (最基本的) PUSH(入棧) push ax:將暫存器ax中的資料送

iOS 隨意push,pop到任意控制器

主題思想:如A、B、C、D 四個檢視控制器想要在 A push B 後, B 在push 到 D ,然後從 D pop 到 C ,在從 C pop 的A解決方法如下:1.假如此時在 A 控制器下,想要到 push 到 B, 可以這樣寫1[self.navigationCont

Js陣列的操作push,pop,shift,unshift等方法

原文地址:http://www.jb51.net/article/32898.htm js中針對陣列操作的方法還是比較多的,今天突然想到來總結一下,也算是溫故而知新吧。不過不會針對每個方法進行講解,我只是選擇其中的一些來講。  首先來講一下push和pop方法,這兩個方法

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

對於文件的更新除替換外,針對某個或多個文件只需要部分更新可使用原子的更新修改器,能夠高效的進行文件更新。更新修改器是中特殊的鍵, 用來指定複雜的操作,比如增加、刪除或者調整鍵,還可能是運算元組或者內嵌文件。 1.$inc --------------------------

在常數時間內完成push,pop,getMin的棧

class GetMinStacke { public: void push(int x) { elements.push(x); if (minStack.empty() || x &

題目:棧的表示和實現(建立棧,push,pop)

#include<iostream> using namespace std; #define STACK_INIT_SIZE 100  //儲存空間初始分配量 #define STACINEREMENT 10     //儲存空間分配增量 #define ER

棧&佇列面試題之實現一個棧...(Push,Pop,Min)

實現一個棧,要求實現Push(壓棧),Pop(出棧),Min(返回最小值的操作)的時間複雜度為O(1)         我們知道棧是後進先出的一種資料結構,這種資料結構只允許在棧頂進行插入刪除,所以要

ios7 push pop 動畫突然消失的解決方案

轉載自:  http://2goo.info/weblog/detail/237512 這幾天開發的程式遇到了這樣的問題。 突然之前在ios7執行的程式全無動畫效果。 系統自帶的push pop之類的也完全沒有動畫效果,就好像view直接add上去的一樣。 蛋疼。

堆的操作——push/pop

#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <alg

資料結構---設計一個棧,push, pop, min 時間複雜度都是 O(1)

普通的棧,push, pop 操作的複雜度是 O(1), 但是如果要找出其中的最小值,則需要 O(N)的時間。 題目要求 min 複雜度也是 O(1), 做法便是 空間換時間,每一步棧的最小值都用一個

堆疊PUSHPOP 自測體會

ARM處理器小端模式且編譯器是採用“滿遞減”方式,多工指標初始位置如上圖所示。 “滿遞減”:PUSH使得SP遞減,POP使得SP遞增 說明:ARM處理器大部分是採用小端模式的,而且像ADS、IAR、KEIL等對ARM系列的處理器都採用小端模式,且堆疊是採用“滿遞減”方式。 K

ARM 指令集 之 PUSH and POP

  示例 :           PUSH    {R4,LR}   將低暫存器R4入棧,LR也入棧。             POP     {R4,PC}   將堆疊中的資料彈出到低暫存器 R4 及 PC 中   說明 :        暫存器入棧及出棧指