一.
字單元,即存放乙個字型資料(16位)的記憶體單元,由兩個位址連續的記憶體單元組成。高位址記憶體單元中存放字型資料的高位位元組,低位址記憶體單元中存放字型資料的低位位元組。
mov al,[0] 中[…]表示乙個記憶體單元,[…]中的0表示記憶體單元的偏移位址
mov bx,1000h
mov ds,bx
mov al,[0]
表示將1000h(1000:0)中的資料讀到al中
mov、add、sub是具有兩個操作物件的指令。jmp是具有乙個操作物件的指令
二.push ax表示將暫存器ax中的資料送入棧中,pop ax 表示從棧頂取出資料送入ax。8086cpu的入棧和出棧操作都是以字為單位進行的。
8086cpu中有兩個暫存器,段暫存器ss和暫存器sp,棧頂的段位址存放在ss中,偏移位址存放在sp中,任意時刻ss:sp指向棧頂元素。push指令和pop指令執行時,cpu從ss和sp中得到棧頂的位址。
push ax的執行步驟分為下面兩步
(1) . sp=sp-2,ss:sp指向當前棧頂前面的單元,以當前棧頂前面的單元為新的棧頂;
(2) .將ax中的內容送入ss:sp指向的記憶體單元處,ss:sp此時指向新棧頂。
棧滿時使用push指令入棧,或棧空時在使用pop指令出棧,都將發生棧頂超界問題。。在程式設計時要根據可能用到的最大棧空間來安排棧的大小,防止入棧的資料太多而導致的超界;出棧時也要注意防止棧空的時候繼續出棧導致的超界。
push 暫存器 ;將乙個暫存器中的資料入棧
pop 暫存器;用乙個暫存器接收出棧的資料
push 段暫存器 ;講乙個段暫存器中的資料入棧
pop 段暫存器;用乙個段暫存器接收出棧的資料
push 記憶體單元;將乙個記憶體字單元處的字入棧(棧操作都是以字為單位)
pop 記憶體單元;用乙個記憶體字單元接收出棧的資料
指令執行時,cpu要知道記憶體單元的位址,可以再push、pop指令中只給出記憶體單元的偏移位址,段位址在指令執行時,cpu從ds中取得。
三.我們可以用乙個段存放資料,將它定義為「資料段」
對於資料段,將它的段位址放在ds中,用mov、add、sub等訪問記憶體單元的指令時,cpu就將我們定義的資料段中的內容當做資料來訪問
我們可以用乙個段存放**,將它定義為「**段」
對於**段,將它的段位址放在cs中,將段中第一條指令的偏移位址放在ip中,這樣cpu就將執行我們定義的**段中的指令
我們可以用乙個段當做棧,將它定義為「棧段」
對於棧段,將它的段位址放在放在ss中,將棧頂單元的偏移位址放在sp中,這樣cpu在需要進行棧操作的時候,比如執行push、pop指令等,就將我們定義的棧段當作棧空間來用。
一段記憶體,可以既是**的儲存空間,又是資料的儲存空間,還可以是棧空間,也可以什麼也不是,關鍵在於cpu中暫存器的設定,即cs,ip,ss,sp,ds的指向。
組合語言 第三章
1.記憶體中字的儲存 2.ds暫存器 8086cpu自動取ds中的資料為記憶體單元的段位址,並且ds的值並不能直接賦給,要先將值賦給乙個一般暫存器進行中轉,在傳入ds中。3.mov,add,sub命令。mov 賦值。mov指令中只給出單元的偏移位址,段位址預設存在ds中。add 將後面的資料加到前面...
組合語言第三章總結
如何看待 記憶體 可以存放資料 資料段 自己定義的資料 可以存放指令 指令段 自己定義的指令 可以定義成棧空間 棧段 臨時存放資料 那麼如何讓 cpu 按照我們的意願去訪問記憶體?對於資料段,我們需要有段位址 偏移位址,目前段位址暫存器只學過 ds 暫存器,偏移位址只學過 0 1 進行訪問 對於指令...
《組合語言》第三章 暫存器(記憶體訪問)
在記憶體單元中,位址高的是高位,位址低的是低位。我們在讀取記憶體時喜歡從0開始讀,但我們在讀取數字的時候一定不喜歡從最低位開始讀,所以如果這個分不清,那麼是這個是相當 痛苦的 所以,乙個資料如果確定是乙個字,那麼直接從高位開始讀取,這樣更好理解。如果直接將記憶體單元送入暫存器中,那麼預設送入乙個字,...