組合語言(三)暫存器(記憶體訪問)

2021-09-24 10:48:28 字數 1584 閱讀 7987

在8086cpu中,乙個字由兩個位元組單元組成。

位元組單元,即存放乙個字型資料(16位)的記憶體單元,由兩個連續的記憶體單元組成。在8086中,高位址記憶體單元存放字型資料的高位位元組,低位址存放字型資料的低位位元組。

我們將起始位置位n的字單元簡稱位n位址字單元。

同樣的cpu讀取乙個記憶體單元的時候。記憶體單元位址由基礎位址(段位址*10h)+偏移位址組成。

其中ds段暫存器中儲存記憶體單元的基礎位址。而我們在訪問記憶體單元時,只需要在指令中給出偏移位址即可。

如我們想要訪問220ff位址空間的資料,將其移動到ax暫存器

mov ax,2200

mov ds,ax

mov ax,[ff]

其中ff為偏移位址。同時要注意段暫存器可以使用mov命令,但是不能夠使用直接量。只能使用另外乙個暫存器進行中轉。

這屬於8086的硬體設計的問題。

還有addsub命令的操作物件中也不能有段暫存器。

8086有16根資料匯流排,所以可以直接在16為暫存器中進行16位資料的傳送。只需要給出字單元位址就可以了。

需要注意的是:

mov可以對段暫存器進行操作,但是不能對cs(指令段暫存器進行操作)

段暫存器都不能使用立即數

add,sub都不能將段暫存器作為操作物件之一

棧是一種具有特殊的訪問方式的儲存空間。他的特殊性就在於,最後進入這個空間的資料,最先出去(lifo,last in first out)。

從程式化的角度來講,需要乙個標記,這個標記指示著棧頂。

棧的基本操作有兩種,入棧(讓如),出棧(取出)。

8086cpu提供了兩個暫存器用來定義棧。其中段暫存器ss用來定義棧頂的基礎位址,sp用來定義棧頂的偏移位址。

同樣是:基礎位址(段位址*10h)+偏移位址

同時彙編分別提供了push和pop命令。

我們知道8086只是提供了指示棧頂的ss,sp暫存器,並提供了push,pop指令。但是這樣就存在了乙個問題,我們不知道棧的邊界。所以很容易造成越界的操作。

這兩個指令,實際上就是一種記憶體傳送指令。可以發現,他在任何時候,指令都只會做以下三種操作:

將記憶體的資料送入棧(記憶體)/將棧(記憶體)的資料送入暫存器

更改sp暫存器的值

同時可以很了解到棧的最大大小,因為sp為16位暫存器。所以棧頂的變化範圍最大位0~ffffh。也就是64kb。

同時安排cpu來放問這些段:

debug中對於d,e,a,u命令可以使用段暫存器來代替基礎位址。

在debug時,執行修改棧暫存器的指令以後不會停止執行,而是會將緊接的下一條指令執行。

涉及:中斷機制。

來自為知筆記(wiz)

posted @

2019-06-09 18:12

秦曉 閱讀(

...)

編輯收藏

組合語言 暫存器 記憶體訪問

記憶體中字的儲存 cpu中,用16位暫存器來儲存乙個字,乙個字要用兩個連續的記憶體單元來存放,這個字的低位位元組存放到低位址單元中,高位位元組存放在高位址單元中。假如用0 1兩個記憶體單元存放乙個字,這兩個單元看作乙個起始位址為0的字單元。ds和 address 8086cpu中有乙個ds暫存器,通...

組合語言 暫存器(記憶體訪問)

在cpu中,用16位來儲存乙個字,高8位存放高位元組,低8位存放低位位元組。在記憶體中時,由於記憶體單元是位元組單元,剛乙個字要用2個位址連續的記憶體單元來存放,字的低位位元組存在低位址單元.字單元 存放乙個字型資料 16位 的記憶體單元,由兩個位址連續的記憶體單元組成,高位址記憶體單元中存放字型資...

組合語言 暫存器(記憶體訪問)

暫存器 記憶體訪問 字的儲存,乙個字占用兩個位元組,在記憶體單元中儲存要用兩個位址連續的記憶體單元來存放 低位位元組放在低位址單元中,字單元,即兩個位址連續的記憶體單元 ds和 address ds暫存器通常用來存放要訪問資料的段位址 mov al,0 mov al,ds 0 資料訪問的段位址預設d...