編譯原理學習筆記(第三章 暫存器(記憶體訪問))

2021-10-24 22:30:07 字數 2197 閱讀 4060

之前從從訪問記憶體的角度再來學幾個重要的暫存器。

cpu中,用16位暫存器來儲存乙個字(兩個位元組),但是記憶體單元是位元組單元(乙個單元存放乙個位元組),所以乙個字要用兩個連續的記憶體單元來存放,低位位元組存放低位址單元中,高位位元組存放在高位址單元中。

mov bx, 1000h

mov ds, bx

mov al, [0]

上面的三條指令將 10000h(1000:0)中的資料讀到 al 中。

由於8086cpu不支援將記憶體資料直接讀入ds(段暫存器),所以需要先將記憶體資料先讀入bx(通用暫存器),然後再將資料在暫存器間轉移。

「 mov al, [0] 」中 「[ ]」 表示乙個記憶體單元, 「[ ]」 中的 0 表示記憶體單位的偏移位址,而記憶體的段位址是 8086cpu 從 ds 暫存器中自動讀取的,所以在把資料移入暫存器中之前,需要先行把 1000h 送入ds。

因為 8086cpu 是 16 位結構,有 16 根資料線,所以可以一次傳送乙個字。只要在 mov 指令中給出 16 位的暫存器就可以進行 16 位資料的傳送了。

mov用法彙總:

指令格式

示例**

mov 暫存器,資料

mov ax,8

mov 暫存器,暫存器

mov ax,bx

mov 暫存器,記憶體單元

mov ax,[8]

mov 記憶體單元,暫存器

mov [8],ax

mov 記憶體單元,段暫存器

mov ax,1000h; mov ds,ax;mov [0],cs

mov 段暫存器,記憶體單元

mov ax,1000h; mov ds,ax;mov ds,[0]

mov 段暫存器,暫存器

mov ds,ax

mov 暫存器,段暫存器

mov ax,ds

注意,當使用 ax 暫存器與記憶體空間之間進行操作時,記憶體偏移的位址為 2,因為 ax 為十六位暫存器,每次傳輸資料時會傳輸乙個字大小的

add用法彙總:

指令格式

示例**

add 暫存器,資料

add ax,8

add 暫存器,暫存器

add ax,bx

add 暫存器,記憶體單元

mov ax,[8]

add 記憶體單元,暫存器

mov [8],ax

add 不能操作段暫存器!因為段暫存器用於存放段位址,不能作為運算元(硬體層面沒有實現)。

sub 同理。

對於 8086pc,可以根據需要,把一組記憶體單元定義為乙個段。如果將**一組長度為n(n <= 64kb)、位址連續、起始位址為 16 的倍數的記憶體單元當作專門儲存資料的記憶體空間,**這段記憶體空間被稱為「資料段」

操作規則:lifo(last in first out)

從程式化的角度說,有乙個標記一直指示著棧頂的元素。

8086cpu 提供相關的指令來以棧的方式訪問記憶體空間,就是說,可以把一段記憶體當作棧來使用。

以上指令以字為單位進行

那麼,cpu是如何確定哪段記憶體被作為棧來使用呢?

任意時刻,ss:sp 指向棧頂元素,push 和 pop 指令執行時,cpu 從 ss 和 sp 中得到棧頂的位址。

8086cpu 中並沒有記錄棧的容量的暫存器,它只考慮當前棧頂的位置,所以無論是入棧還是出棧時都有可能使得棧頂越界,使得棧空間以外的資料、**被覆蓋。

除了通用暫存器以外,push 同樣可以把段暫存器、記憶體單元作為運算元。

切記:push 和 pop 的操作規模永遠是乙個字。

對於 8086pc,可以根據需要,把一組記憶體單元定義為乙個段。如果將**一組長度為n(n <= 64kb)、位址連續、起始位址為 16 的倍數的記憶體單元當作專門棧空間的記憶體空間,**這段記憶體空間被稱為「棧段」

前提:將 ss:sp 指向我們定義的棧段。

第三章 暫存器(記憶體訪問)

cpu中,用16位暫存器來儲存乙個字,高8位存放高位位元組,低8位存放低位位元組。例如 資料20000 4e20 h 在記憶體中存放的方式為 低 20 h 棧頂 高 4e h 棧底 cpu要讀寫乙個記憶體的時候,必須先給出這個記憶體單元的位址,同樣是由段位址和偏移位址組成。這個是靠ds暫存器,它用來...

第三章 暫存器知識總結

記憶體中字的儲存 用16位暫存器來儲存乙個字,乙個字要用兩個位址連續的記憶體單元來存放 乙個單元存放乙個位元組 其順序是高 高,低 低,即小端法。字單元概念 即存放乙個字型資料 16位 的記憶體單元,由兩個位址連續的記憶體單元組成。高位址記憶體單元中存放字型資料的高位位元組,低位址記憶體單元中存放字...

第三章 暫存器(記憶體訪問)

3.1 記憶體中字的儲存 cpu中用16位暫存器儲存乙個字,高八位放高位位元組,第八位放低位位元組,我們的儲存有兩種方式,一種是大端法,一種是小端法 3.2 ds和 address cpu要讀寫記憶體單元的時候,必須先給出這個記憶體單元的位址,記憶體單元的位址由段位址和偏移位址組成 ds暫存器是用來...