第二章 第五節

2021-06-02 13:32:34 字數 2419 閱讀 2432

段暫存器就是提供段位址的。

8086cpu有4個段暫存器:cs、ds、es、ss

cs:**段

ds:資料段

ss:堆疊段

es:附加段

要從記憶體中讀取指令或者資料,就要制定儲存指令或者資料的記憶體單元的位址,

8086的位址匯流排的寬度為20位,而8086內部暫存器的寬度都是16位的,所以採用 段位址 * 16 + 偏移位址 的方法來生成20位的位址。

所以當8086cpu要訪問記憶體時,由這四個暫存器提供記憶體單元的段位址。

cs和ip是8086cpu中最關鍵的暫存器,它們指示了cpu當前要讀取指令的位址。

cs為**段暫存器,ip為指令指標暫存器。

cs提供**段的段位址,ip提供偏移位址,cs:ip指向了cpu當前要讀取指令的記憶體單元的位址。

8086讀取和執行指令描述:

2、位址20000h經由輸入輸出控制電路,被送入到20位的位址匯流排上。

3、位址為20000h的記憶體單元被選中,然後資料b82301經由資料匯流排(分三次傳輸)被送入到輸入輸出控制電路上。

4、b82301被送入到指令緩衝器中,ip暫存器的內容被自動加3。

5、執行控制器執行指令緩衝器中的內容。

6、重複步驟1~5。

8086cpu加電啟動或復位後(即cpu剛開始工作時)cs和ip被設定為cs=ffffh,ip=0000h。

即在8086pc機剛啟動時,cpu從記憶體ffff0h單元中讀取指令執行。

ffff0h單元中的指令是8086pc機開機後執行那個的第一條指令。

在任何時候,cpu將cs、ip中的內容當做指令的段位址和偏移位址,用它們合成指令的實體地址,到記憶體中讀取指令碼,執行。

如果說,記憶體中的以簡訊息曾被cpu執行過的話,那麼,它所在的記憶體單元必然被cs:ip指向過。

在cpu中,程式設計師能夠用指令讀寫的部件只有暫存器,程式設計師可以通過改變暫存器中的內容實現對cpu的控制。

cpu從何處執行指令是由cs、ip中的內容決定的,程式設計師可以通過改變cs、ip中的內容來控制cpu執行目標指令。

我們如何改變cs、ip的值呢?

mov指令,如mov ax,123

mov指令可以改變8086cpu大部分暫存器的值,被稱為傳送指令。

能夠通過mov指令改變cs、ip的值嗎?

答案是:mov指令不能用於設定cs、ip的值,8086cpu為cs、ip提供了另外的指令改變它們的值:轉移指令jmp

同時修改cs、ip的內容:

例如:jmp  2ae3:3

jmp  3:0b16

僅修改ip的內容:

jmp  某一合法暫存器(合法暫存器例如通用暫存器)

例如:jmp  ax (類似於mov ip, ax)

jmp  bx

功能:用暫存器中的值修改ip。

問題分析:cpu執行的流程

1、cs = 2000h,ip = 0000h,選中的記憶體單元為20000h

2、執行20000h記憶體單元的指令 mov ax, 6622h

3、cs = 2000h,ip = 0003h,選中的記憶體單元為20003h

4、執行20003h記憶體單元的指令 jmp  1000:3

5、cs = 1000h,ip = 0003h,選中的記憶體單元為10003h

6、執行10003h記憶體單元的指令 mov ax, 0123h

7、cs = 1000h,ip = 0006h,選中的記憶體單元為10006h

8、執行100006h記憶體單元的指令 mov bx, ax

9、cs = 1000h,ip = 0008h,選中的記憶體單元為10008h

10、執行10008h記憶體單元的指令 jmp bx

11、cs = 1000h,ip = 0000h,選中的記憶體單元為10000h

12、執行10000h記憶體單元的指令 mov ax, 0123h

13、重複步驟5~12

對於8086pc機,在程式設計時,可以根據需要,將一組記憶體單元定義為乙個段。

可以將長度為n(n<=64kb)的一組**,存在一組位址連續,起始位址為16的倍數的記憶體單元中,這段記憶體是用來存放**的,從而定義了乙個**段。

這段長度為10位元組的位元組的指令,存在從123b0h~123b9h的一組記憶體單元中,我們就可以認為,123b0h~123b9h這段記憶體單元是用來存放**的,是乙個**段,它的段位址為123bh,長度為10個位元組。

如何使得**段中的指令被執行呢?

將一段記憶體當做**段,僅僅是我們在程式設計時的一種安排,cpu並不會由於這種安排,就自動將我們定義的**段中的指令當做指令來執行。

cpu只認被cs:ip指向的記憶體單元中的內容為指令。

所以要將cs:ip指向所定義的**段中的第一條指令的首位址。

段位址在8086cpu的暫存器中存放,當8086cpu要訪問記憶體時,由段暫存器提供記憶體單元的段位址,8086cpu有4個段暫存器,其中cs用來存放指令的段位址。

函式第五節

coding utf 8 1.定義乙個func name 該函式效果如下。assert func lilei lilei assert func hanmeimei hanmeimei assert func hanmeimei hanmeimei def title name if isinsta...

第五節 字典

字典的表現形式為大括號 dict key必須可hash,必須唯一且必須為不可改變的資料型別 value可存放任意多個值,可修改,可不唯一 無序且查詢速度快 鍵 值 鍵值對 1 dic.keys 返回乙個包含字典所有key的列表 2 dic.values 返回乙個包含字典所有value的列表 3 di...

第五節 單鏈表 二

單鏈表中按位置查詢 查詢演算法 1.工作指標p初始化,計數器初始化 2.執行下列操作,直到p為空或指向第i個節點,工作指標後移,計數器增1 3.若p為空,則第i個元素不存在,丟擲位置異常 否則查詢成功,返回節點p的資料元素 具體實現 template t linklist get int i if ...