一、ds和[address]
cpu要讀寫乙個記憶體單元的時候,必須先給出這個記憶體單元的位址,在8086pc中記憶體位址有段位址和偏移位址組成。ds(資料暫存器)中通常存放要訪問資料的段位址。比如要讀取1000h單元的內容,可以用下面這段**:
mov bx,1000h
mov ds,bx
mov al,[0]
注意:由於ds是乙個段暫存器,8086cpu不支援將資料直接送入段暫存器的操作。為什麼?(這就時8086硬體設計問題了) 所以mov ds 1000h是非法的。只能通過將資料先放到普通暫存器中,然後在放到ds暫存器中。
mov指令可以完成兩種傳送:
1、將資料直接送入暫存器(在8086cpu中,不能講資料直接送入ds中)
2、將乙個暫存器中的內容送入另乙個暫存器
mov指令訪問記憶體單元,可以在mov指令中只給出單元的偏移位址,此時,段位址預設在ds暫存器中。
二、cpu提供的棧機制
現在的cpu中都有棧的設計,在基於8086cpu程式設計的時候,可以將一段記憶體當做棧來使用。8086cpu提供入棧和出棧指令,最基本的兩個是push和pop。push ax 表示將暫存器ax中的資料送入棧中,pop ax表示從棧頂取出資料送入ax。8086cpu的出入棧操作都是以位元組為單位進行的。
cpu如何知道當前棧頂的位址? 這個問題和cpu如何知道當前指令的位址一樣,cs ip存放在當前指定的段位址和偏移位址。ss sp存放當前段位址和偏移位址。
三、棧頂超界問題
8086cpu不保證我們對棧的操作不會超界,它只記錄棧頂的位置,需要開發人員自己操心棧頂超屆問題。
四、段的綜述
我們可以將一段記憶體定義為乙個段,用乙個段位址指示段,用便宜位址訪問段內的單元。這完全是我們自己的安排。我們可以有用乙個段存放資料,將它定義為「資料段」。用一段存放**,將它定義為「**段」,用一段當做棧,將它定義為「棧段」。我們可以這樣安排,但是若要讓cpu按照這樣的安排訪問這些段,就要:對於資料段,將它的段位址放到ds中,用mov、add、sub等訪問記憶體單元的指令時,cpu就將我們定義的資料段中的內容當做資料來訪問。對於**段,將它的段位址放在cs中,將段中第一條指令的偏移位址放在ip中,這樣cpu就將執行我們定義的的**段中的指令。
可見,不管我們如何安排,cpu將記憶體中的某段內容當做**,是因為cs:ip指向**。cpu將某段記憶體當做棧,是因為ss:sp指向**。
暫存器(記憶體訪問)
1 記憶體中字的儲存 高位址儲存高位,低位址儲存地位。任何兩個位址連續的記憶體單元,n號單元和n 1號單元,可以將它們看成兩個記憶體單元,也可以看成乙個位址為n的字單元中的高位位元組單元和地位位元組單元。2 ds和 adress cpu要讀取乙個記憶體單元的時候,必須先給出這個記憶體單元的位址。在8...
暫存器(記憶體訪問)
記憶體中字的儲存 ds和 address mov ax,1000h mov ds,axmov add的更多用法 指令描述 mov 暫存器,偏移位址 將位址為ds 偏移位址中的資料送入暫存器 mov 偏移位址 暫存器 將暫存器中的值送入ds 偏移位址 add 暫存器,偏移位址 將指定位址中的值加入暫存...
暫存器 記憶體訪問
一 ds和 address cpu要讀寫乙個記憶體單元的時候,必須先給出這個記憶體單元的位址,在8086pc中記憶體位址有段位址和偏移位址組成。ds 資料暫存器 中通常存放要訪問資料的段位址。比如要讀取1000h單元的內容,可以用下面這段 mov bx,1000h mov ds,bx mov al,...