這裡是引用最近剛剛開始學習組合語言,對於push和pop指令有些疑惑,特意去網上查了資料,在此做乙個總結。
push和pop指令都是對ss堆疊段的操作,ss中存放的是段基址,sp指標存放的是偏移位址。注意入棧出棧操作都是以 字 為單位(也就是2位元組,16位)。
下面貼幾張比較詳細的截圖:
首先從下面這張圖可以看出資料是由下向上入棧的,當執行push指令是,sp指標先向上移位2,然後放入ax(兩個位元組),此時ss:sp指向新棧頂。
pop ax指令的執行過程如下圖所示,先將ss:sp指向的記憶體單元處的資料送入ax中,然後sp向下移位2,指向新棧頂下面的單元。
但這裡有一點需要注意:
當執行完pop ax指令後,1000ch處的2266仍然存在,只不過它不在棧中!
這句話怎麼理解呢,就是說資料出棧後在沒有新的資料進棧前它在記憶體單元中的值沒變,但你幾乎無法常規讀取。當下次執行push指令是,此處原有的資料會被覆蓋。(就好比已出棧的單元就像是已將離婚的男女,他們已經不受法律保護)
WIN16組合語言中PUSH和POP總結
最近在研究彙編,老是將這兩個東東搞混淆,覺得有必要總結一下子。無論是push還是pop,都是對堆疊段ss的處理,ss中存放堆疊段位址,sp指標中存放偏移位址,棧操作都是以字 2位元組 為單位。例如,將通用暫存器ax中的資料入棧,push ax,在16位的彙編中,ax中存放的是兩個位元組單元,這句話的...
彙編push和pop指令
push和pop是用來操作棧的2個指令。push暫存器 將乙個暫存器中的資料入棧 pop暫存器 出棧用乙個暫存器接收資料 下面用一段彙編 學習一下棧的操作,用masm編輯的 環境用的 組合語言 王爽的那套環境 assume cs codesg cs暫存器指向該程式的首位址 codesg segmen...
組合語言中的常數
1,數值常數 二進位制數 10110100b 八進位制數146q,5430 十進位制數146d,543 十六進製制數 1a2fh,0ff00h 實數12.48e 2,1a3c0000r 彙編時,則有匯程式設計序將所有的數值常數都轉換成二進位制標示的目標 凡是以字母a f開頭的十六進製制數,唏噓在前面...