在8086cpu中,乙個字由兩個位元組單元組成。
位元組單元,即存放乙個字型資料(16位)的記憶體單元,由兩個連續的記憶體單元組成。在8086中,高位址記憶體單元存放字型資料的高位位元組,低位址存放字型資料的低位位元組。
我們將起始位置位n的字單元簡稱位n位址字單元。
同樣的cpu讀取乙個記憶體單元的時候。記憶體單元位址由基礎位址(段位址*10h
)+偏移位址組成。
其中ds段暫存器中儲存記憶體單元的基礎位址。而我們在訪問記憶體單元時,只需要在指令中給出偏移位址即可。
如我們想要訪問220ff
位址空間的資料,將其移動到ax暫存器
mov ax,2200
mov ds,ax
mov ax,[ff]
其中ff
為偏移位址。同時要注意段暫存器可以使用mov命令,但是不能夠使用直接量。只能使用另外乙個暫存器進行中轉。
這屬於8086的硬體設計的問題。
還有add
sub
命令的操作物件中也不能有段暫存器。
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...