挑戰408——組成原理(19)——指令的尋址方式

尋址方式是指尋找指令或者操作數的有效地址的方式。即確定本條指令的數據地址及下一條指令將要執行的指令地址的方法。
指令中的地址碼字段並不代表操作數的真實地址,地址碼中的字段,稱爲形式地址(A)。用形式地址結合尋址方式可以計算出操作數在存儲系統中的真實地址,稱爲有效地址(EA)
對於符號 (A),整個內容表示的是地址爲A的數值。而A可以是寄存器的標號,也可以是內存地址,所以(A)是對應的數值。例如EA = (A),可以表示爲有效地址爲地址爲A的數值。

這一部分可以用指針的知識理解,(A)相當於*A,
而EA = (A)相當於,EA = *(*A)

尋址方式分爲指令尋址跟數據尋址兩大類。尋找下一條要執行的指令地址,稱爲指令尋址。尋找操作數的地址稱之爲數據尋址

指令尋址

  1. 順序尋址
    程序的指令序列在主存中順序存放,程序執行的時候,從第一條指令開始,逐條取出並逐條執行。這種程序的順序執行,稱爲順序尋址方式。
    爲了達到順序尋址的目的,CPU中必須有一個程序計數器(PC).對指令的順序號進行計數。PC中開始時存放的是程序的首地址,每執行一條指令,PC+1,用來指明下一條指令所在內存的地址,直到程序結束。這裏一定注意,PC中存放的是下一條指令的地址。
  2. 跳躍尋址
    當程序出現分支或者循環的時候,就會改變程序的執行順序,此時對指令尋址採取跳躍尋址方式。。所謂跳躍,便是指下條指令的地址並不是通過PC的當前值來獲取的,而是由指令本身給出,跳躍的處理方式是重新修改PC的內容,然後進入取指令階段(也就是說,下一條指令的地址仍由PC所給出,只不過它的值被修改了。)

數據尋址

數據的尋址方式比較多樣,其過程就是把操作數的形式地址,變換成操作數的有效地址的過程。通常數據尋址的指令格式如下:
在這裏插入圖片描述
通常我們約定:指令字長 = 存儲字長 = 機器字長。
根據操作數存放的不同位置,從而衍生出各種不同的尋址方式,往往不同的計算機有不同的尋址方式。而操作數,通常位於:

  • 包含在指令中
  • 包含在CPU的某一寄存器中
  • 包含在主存儲器中
  • 包含在I/O設備的端口中
  1. 隱含尋址
    這種類型的指令,不是明顯的給出操作數的地址,而是在指令中隱含着操作數的地址,顯然單地址指令就是如此。(比如利用ACC作爲第二操作數的地址,因此,累加器ACC對單地址指令格式來說是隱含地址)。
    優點:利於縮短指令字長,可簡化地址結構,是獲取操作數最快的方式
    缺點:需要增加存儲操作數的硬件或者隱含地址的硬件。
  2. 立即尋址
    這種類型的指令,地址字段是操作數本身,因此,又稱立即數尋址,數據採用補碼的方式存放。
    看下面的彙編代碼,分號後面是註釋:
mov ax,2308H ;2308 ->ax

意思是將2308H這個地址移動到ax寄存器中,這樣,給出的地址就是操作數本身。
在這裏插入圖片描述
優點:在取指令的時候,操作碼跟操作數被同時取出,不必再次訪存,提高了指令的執行速度。
缺點:因操作數指令的一部分,因此不能被修改,而且對於定長指令格式,操作數大小還將受到長度的限制。

所以,通常用於給定的某一寄存器或者主存單元賦值,或者用於提供某一常數。換成C++代碼可以看成:

int x = 100;
const int j = 100;
···
  1. 直接尋址
    即地址碼字段直接給出操作數所在的內存地址,即EA = A的情況。如下面的彙編指令:
mov ax [200]; 將地址爲200處的數據,存放到ax中

這種行爲就像程序中直接給出變量名:

int y = x;

在這裏插入圖片描述
優點:簡單,執行階段值訪問一次內存,因此在早期的計算機中,常常作爲主要的尋址方式
缺點:A的位數決定了該指令操作數的尋址範圍,並且操作數的地址不易被修改。

  1. 間接尋址
    間接尋址是相對直接尋址而言的,指令的地址字段不是操作數的真實地址,而是操作數的有效地址所在的存儲單元的地址,聽起來有點拗口,也就是操作數地址的地址,即EA = (A),間接尋址可以是一次間接尋址也可以是多次間接尋址。如果還是有點不好理解,那麼用下圖來理解(用間接尋址的方式取出788這個數):
    在這裏插入圖片描述
    優點:明明可以一步到位,爲什麼還有多此一舉?顯然,這種方式可以擴大尋址範圍,將小地址作爲一個跳板,可以訪問更多的地址空間,便於編程(子程序中的返回)。
    缺點:需要進行多次訪存(一次的間接尋址就需要兩次訪存)。訪問速度慢。

  2. 寄存器尋址
    是指的在指令中,直接給出操作數所在的寄存器編號,即EA = Ri。操作數在R的內部(類似於直接尋址)。
    就像下面的彙編指令:

mov ax,bx

在這裏插入圖片描述
優點:指令執行時,不訪問內存,只訪問寄存器,指令字短,故執行速度快,支持向量/矩陣運算。
缺點:寄存器的價格昂貴,且計算機內寄存器的數量有限。

  1. 寄存器間接尋址
    類似於間接尋址,寄存器中給出的不是一個操作數,而是操作數所在的主存單元的地址,即EA = Ri。
    用匯編指令表示爲;
mov ax,[bx]

在這裏插入圖片描述
這種做法的主要特點就是,比間接尋址快,但是由於操作數在主存中,故仍需要訪問內存,一般用於擴大尋址範圍

  1. 相對尋址
    這種尋址方式的原理是基於程序的局部性原理。指令中的A,加上PC上的內容,作爲操作數的地址。即EA = (PC)+ A。其中A是相對於當前地址的偏移量。可正可負。用補碼錶示。
    在這裏插入圖片描述
    特點:A的位數決定操作數的尋址範圍。操作數不固定,隨着PC的變化而變化,並與指令地址總差一個固定值。便於程序浮動。被廣泛用於轉移指令(即jump指令)。
    這裏注意理解PC指令的作用。比如下面的句子:

jump A

CPU從存儲器中取一個字節,即(PC)+1 ->PC.也就是說PC自增1.若此時,轉移指令的地址爲X,且佔2個字節。那麼取出該指令後,PC自增2,即(PC) = X + 2。執行完這個指令後,跳到X+2 + A處繼續執行。

  1. 基址尋址(面向系統)
    基址尋址,是將CPU中的基址寄存器(BR)的內容,加上指令格式中的形式地址A,從而形成有效地址。即EA = A +(BR)。
    在這裏插入圖片描述
    特點:可以擴大尋址範圍(因爲基址的位數可以設置爲很長)。BR的內容可由操作系統或者管理程序確定。程序的執行期間,BR內容不變但是A的內容可變。有利於多道程序的設計。
  2. 變址尋址(面向用戶)
    這種做法是,指定一個變址寄存器IX,有效地址等於A與寄存器IX的內容相加。即 EA = A +(IX)。與上面的基址尋址的方法不同,IX的內容可以隨要求填入,IX既可以用專用的寄存器,又可以用通用寄存器。用匯編指令可以表示爲:
mov ax,200[si]

過程如圖:
在這裏插入圖片描述
變址尋址是一種被廣泛採用的尋址方式。最典型的應用就是將指令的地址碼部分給出的地址A作爲基準地址,而將變址寄存器中的內容作爲修改量。在遇到需要頻繁修改操作數地址的操作時,無需修改指令,只要修改變址寄存器中的編址值即可。
在編程中,可設A爲數組首地址,不斷修改寄存器的內容,便可以得到數組中的任一數據地址。特別適合編制循環程序。

  1. 堆棧尋址
    堆棧是存儲器中按LIFO的方式管理的存儲區,該存儲區的讀/寫單元地址用一個特定的寄存器給出,該寄存器稱爲堆棧指針(SP)。堆棧分爲硬堆棧跟軟堆棧兩種。
    寄存器堆棧稱爲硬堆棧,從主存中劃出一段區域稱爲軟堆棧。
    這裏注意sp一開始指向爲空,所以在彈出的時候,先加1,因爲有數據的時候纔可以彈出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章