相對指令

相對指令

機器指令是用機器字來表示的,表示一條指令的機器字,就稱為指令字,通常簡稱指令。相對指令是絕對指令而言,相對指令是指按照相對跳躍定址方式執行地指令。相對指令一般是在轉移或循環程式中運行。相對指令運行空間是當前程式地址空間。

簡介

計算機指令就是指揮機器工作的指示和命令,程式就是一系列按一定順序排列的指令,執行程式的過程就是計算機的工作過程。絕對指令是指按照絕對跳躍定址方式執行地指令。相對指令是指按照相對跳躍定址方式執行地指令。相對指令運行在當前程式地址空間中,絕對指令運行在一個新的程式空間中。相對指令有時也可稱作條件轉移指令。

相對跳轉指令

格式如下:

SJMP rel ; (PC)+2→rel PC [2]

這條指令執行的時候先將PC的內容加2,再加相對偏移量rel,計算出跳轉目的地址。rel是一個帶符號的位元組數,在程式中用補碼錶示,其值範圍為-128B~+127B,當rel為正數時表示正向跳轉,為負數時表示負向跳轉。

條件轉移指令

件轉移指令是一組極其重要的轉移指令,它根據標誌暫存器中的一個(或多個)標誌位來決定是否需要轉移,這就為實現多功能程式提供了必要的手段。微機的指令系統提供了豐富的條件轉移指令來滿足各種不同的轉移需要。條件轉移指令格式如下:

Jcond [ 運算元, ] short-lable,該指令的功能是, 若條件滿足則short-lable 的地址送 PC, 否則順序執行。

條件轉移指令是相對轉移指令, 相對轉移指令實現轉移的範圍為一個位元組的偏移量, 該偏移量即是機器指令代碼rel。偏移量 rel 的大小從當前地址 (執行該指令時的 PC 值, 也就是該相對轉移指令的下一條指令的地址) 到短標號short-lable 地址為- 128 ~ 127, 從相對轉移指令的地址到短標號 short-lable地址則為- 126 ~ 129。偏移量 rel 是一補碼數, 若其為負數則是向低地址轉移, 若其為正數則是向高地址轉移。

偏移量 rel=short-lable 地址-當前地址,或,

偏移量rel=short-lable地址- (相對轉移指令地址+相對轉移指令位元組數)

偏移量 rel 由彙編程式彙編時自動計算填入。相對轉移指令執行的操作是: 條件成立, PC的當前地址加上偏移量 rel, 亦即短標號 short-lable 地址送 PC; 條件不成立, 不進行上述加操作, 即執行相對轉移指令的下一條指令。再如, 短轉移指令格式: SJMP short-lable該指令的功能是將程式無條件轉向短標號 short-lable。 其機器指令操作碼是 80H, 運算元是偏移量 (即 rel) 80H ~ 7FH。指令 HERE:SJMPHERE或 SJMP $, 其偏移量為HERE- ( HERE+2 ) =-2=FEH, 所以該指令機器碼為 80FEH。即, 在指令中給出的是目的地址 (通常以目的標號的形式存在) , 而不是偏移量 rel。偏移量 rel 是機器代碼, 是在實現 “彙編” 的過程中彙編程式自動計算形成的機器碼。

程式循環

循環是計算機科學運算領域的用語,也是一種常見的控制流程。循環是一段在程式中只出現一次,但可能會連續運行多次的代碼。循環中的代碼會運行特定的次數,或者是運行到特定條件成立時結束循環,或者是針對某一集合中的所有項目都運行一次。在一些函式程式語言(例如Haskell和Scheme)中會使用遞歸或不動點組合子來達到循環的效果,其中尾部遞歸是一種特別的遞歸,很容易轉換為疊代。

C語言中提供四種循環,即goto循環、while循環、do…while循環和for循環。四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環,因為強制改變程式的順序經常會給程式的運行帶來不可預料的錯誤,在學習中我們主要學習while、do…while、for三種循環。常用的三種循環結構學習的重點在於弄清它們相同與不同之處,以便在不同場合下使用。這就要清楚三種循環的格式和執行順序,將每種循環的流程圖理解透徹後就會明白如何替換使用,如把while循環的例題,用for語句重新編寫一個程式,這樣能更好地理解它們的作用。特別要注意在循環體內應包含趨於結束的語句(即循環變數值的改變),否則就可能成了一個死循環,這是初學者的一個常見錯誤。

定址方式

順序定址方式

由於指令地址在記憶體中按順序安排,當執行一段程式時,通常是一條指令接一條指令地順序進行。也就是說,從存儲器取出第1條指令,然後執行這條指令;接著從存儲器取出第2條指令,再執行第二條指令;接著再取出第3條指令。

這種程式順序執行的過程,稱為指令的順序定址方式。為此,必須使用程式計數器(又稱指令計數器)PC來計數指令的順序號,該順序號就是指令在記憶體中的地址。

跳躍定址方式

當程式轉移執行的順序時,指令的定址就採取跳躍定址方式。所謂跳躍,是指下條指令的地址碼不是由程式計數器給出,而是由本條指令給出。注意,程式跳躍後,按新的指令地址開始順序執行。因此,程式計數器的內容也必須相應改變,以便及時跟蹤新的指令地址。

採用指令跳躍定址方式,可以實現程式轉移或構成循環程式,從而能縮短程式長度,或將某些程式作為公共程式引用。指令系統中的各種條件轉移或無條件轉移指令,就是為了實現指令的跳躍定址而設定的。

地址空間

地址空間(address space)表示任何一個計算機實體所占用的記憶體大小。比如外設、檔案、伺服器或者一個網路計算機。地址空間包括物理空間以及虛擬空間。

物理地址 (physical address): 放在定址匯流排上的地址。放在定址匯流排上,如果是讀,電路根據這個地址每位的值就將相應地址的物理記憶體中的數據放到數據匯流排中傳輸。如果是寫,電路根據這個地址每位的值就將相應地址的物理記憶體中放入數據匯流排上的內容。物理記憶體是以位元組(8位)為單位編址的。

虛擬地址 (virtual address): CPU啟動保護模式後,程式運行在虛擬地址空間中。注意,並不是所有的“程式”都是運行在虛擬地址中。CPU在啟動的時候是運行在實模式的,核心在初始化頁表之前並不使用虛擬地址,而是直接使用物理地址的。

相關詞條

熱門詞條

聯絡我們