記憶體中字的儲存
cpu中,用16位暫存器來儲存乙個字,乙個字要用兩個連續的記憶體單元來存放,這個字的低位位元組存放到低位址單元中,高位位元組存放在高位址單元中。假如用0、1兩個記憶體單元存放乙個字,這兩個單元看作乙個起始位址為0的字單元。
ds和[address]
8086cpu中有乙個ds暫存器,通常用來存放要訪問資料的段位址。比如我們要讀取10000h單元中的內容,可用下面的程式段進行:
mov bx,1000h
mov ds,bx
mov al,[0]
上面的3條指令將10000h(1000:0)中的資料讀到al中。我們使用mov指令將乙個記憶體單元中的內容送入乙個暫存器中,格式為:mov 暫存器名,記憶體單元位址。暫存器用暫存器名來指明,記憶體單元則用記憶體單元的位址指明。[…]中的0表示記憶體單元的偏移位址,指令執行時,8086cpu自動取ds中的資料為記憶體單元的段位址。
我們之所以使用 mov bx,1000h 是因為:8086cpu不支援將資料直接送入段暫存器的操作,所以用乙個暫存器來進行中轉。
cpu提供的棧機制
現今的cpu中都有棧的設計,8086cpu提供相關的指令來以棧的方式來訪問記憶體空間,在基於8086cpu程式設計時,可以將一段記憶體當作棧來使用,cpu並不會由於這種安排,就在執行棧操作相關的指令時自動地將我們定義的棧段當作棧空間來訪問。
最基本的指令是push(入棧)和pop(出棧)。比如push ax 表示將暫存器ax中的資料壓入棧中,pop ax 表示從棧頂取出資料送入ax。8086cpu的入棧和出棧操作都是以字為單位進行的。
cpu如何知道棧頂的位置?**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此時指向新棧頂。
怎麼初始化乙個空棧?如果將10000h-1000fh這段空間當作棧,初始狀態棧是空的,此時ss=1000h,sp=0010h。因為:棧最底部的字單元位址為1000:000eh,任意時刻,ss:sp指向棧頂,當棧中只有乙個元素的時候,sp=000eh。當棧為空時,就相當於棧中唯一的元素出棧,出棧後,sp=sp+2=10h。所以,當棧為空時,ss=1000h,sp=10h。
pop ax的執行,由以下兩部來完成:
(1)將ss:sp指向的單元處的資料送入ax中;
(2)ps=sp+2,ss:sp指向當前棧頂下面的單元,以當前棧頂下面的單元為新的棧頂。
需要注意的是:pop操作執行後原記憶體單元處的資料依然存在,但是它不在棧中,當再次執行push等入棧指令後,它將被覆蓋。
棧頂超界的問題
8086cpu只知道棧頂在何處(由ss:sp指示),而不知道我們指定的棧空間有多大。所以當棧滿的時候在push或者當棧空的時候再使用pop指令,都將發生棧頂超界問題。
push和pop指令
push和pop的物件可以是一般的暫存器、段暫存器、記憶體單元或者偏移位址。
我們將10000h-1000fh這段空間當作棧,初始狀態棧是空的,將ax,bx,ds中的資料入棧。
mov ax,10000h
mov ss,ax
mov sp,0010h ;初始化棧頂
push ax
push bx
push ds
push和pop等棧操作指令,修改的只是sp。也就是說棧頂的變化範圍最大為:0-ffffh,最大長度為64kb。
段的綜述
我們對記憶體的使用,關鍵在於cpu中暫存器的設定,即cs、ip,ss、sp,ds的指向。
組合語言 暫存器(記憶體訪問)
在cpu中,用16位來儲存乙個字,高8位存放高位元組,低8位存放低位位元組。在記憶體中時,由於記憶體單元是位元組單元,剛乙個字要用2個位址連續的記憶體單元來存放,字的低位位元組存在低位址單元.字單元 存放乙個字型資料 16位 的記憶體單元,由兩個位址連續的記憶體單元組成,高位址記憶體單元中存放字型資...
組合語言 暫存器(記憶體訪問)
暫存器 記憶體訪問 字的儲存,乙個字占用兩個位元組,在記憶體單元中儲存要用兩個位址連續的記憶體單元來存放 低位位元組放在低位址單元中,字單元,即兩個位址連續的記憶體單元 ds和 address ds暫存器通常用來存放要訪問資料的段位址 mov al,0 mov al,ds 0 資料訪問的段位址預設d...
組合語言 暫存器(記憶體訪問)
本文主要從cpu如何執行指令的角度講解了8086cpu的邏輯結構 形成實體地址的方法 相關的暫存器以及一些指令 在cpu中,用16位來儲存乙個字,高8位存放高位元組,低8位存放低位位元組。在記憶體中時,由於記憶體單元是位元組單元,剛乙個字要用2個位址連續的記憶體單元來存放,字的低位位元組存在低位址單...