奧推網

選單
財經

組合語言指令的基本形式

這次我們將正式進入8086/8088CPU指令系統的學習。首先我們給出8086/8088CPU中彙編指令的基本格式。由於彙編指令格式是由機器指令格式演化而來的,因此,儘管我們沒有直接討論機器指令,讀者也能體會到機器指令的構成。構成彙編指令的基本元素包括操作助記符與運算元(或運算元地址)。操作助記符指明指令的功能,而運算元指明指令操作的資料,儘管我們把它稱為“運算元”,但它實質上是某種編碼,而非通常意義下的數。按照指令中明確給出的運算元數量,8086/8088CPU的指令可以分為雙運算元指令、單運算元指令、無運算元指令三類。

定址方式

在學習指令功能前,我們先討論一個重要的、在指令系統中帶有普遍性的問題,即指令中運算元的定址方式。定址方式是指指令獲取運算元的方式,而獲取運算元的關鍵在於其地址的獲取,因此定址方式也可解釋為指令獲取運算元地址的方式。在任何指令中都存在定址方式,它在指令系統中具有普遍性。因此,掌握定址方式是精確理解指令功能的基礎。值得注意的是,一條指令中可能出現多個運算元,而各個運算元可能使用不同的定址方式,即在一條指令中,可能會出現多種定址方式。換言之,定址方式的概念是針對運算元的,而非針對指令。

暫存器定址方式

如果運算元在暫存器中,則指令中以暫存器名稱(地址)的形式給出,並且稱該運算元的定址方式為暫存器定址方式。由於暫存器在CPU內部,CPU訪間暫存器時不需要啟動匯流排操作,因而暫存器定址方式是所有定址方式中速度最快的。

立即數定址方式

如果運算元包含在機器指令內,以立即數字段的形式體現,則稱該運算元為立即數定址方式。立即數定址方式僅能用於源運算元定址,因為立即數是運算元本身,而不是地址,不能用於儲存目的運算元。並且,在單運算元指令中不能使用立即數定址。由於立即數是包含在機器指令內部的,當BIU模組啟動取指週期從記憶體讀取機器指令時,立即數就隨同機器指令被儲存在BU的指令佇列中,EU模組執行指令時,只需從指令佇列中取得立即數,而不需要單獨啟動匯流排操作來讀取。在上章介紹CPU流水線結構時已經說明了BU與EU的並行工作機制,只要當前指令不使用匯流排,則下一條指令的取指週期與當前指令的執行週期重疊,因此在部分情況下,立即數的獲取可以認為是在CPU內部完成的。因此,立即數定址方式的速度僅次於暫存器定址方式,但比其他需要在指令執行週期中啟動匯流排操作的定址方式要快。

儲存器定址方式

如果運算元位於記憶體單元中,則稱該運算元為儲存器定址。讀者應注意儲存器定址與立即數定址的區別。最初即數與儲存器定址的運算元都在記憶體單元中,但立即數是隨機器指令一起在BU的取指週期讀取到CPU內部的,而儲存器定址卻發生在指令的執行週期。

1.直接定址方式

如果直接使用機器指令中的位移量欄位作為記憶體運算元的偏移量,則稱該運算元為直接定址方式。偏移量才等於位移量。在程式設計中,偏移量始終被看作無符號數編碼,但位移量既可以看作無符號數編碼,也可看作補碼,切勿混淆這兩個概念。在初學儲存器定址時,建議讀者將位移量理解為無符號數編碼,關於它作為補碼的用法,在我們學習了條件轉移指令後就會清楚。

2.暫存器間接定址方式

如果記憶體運算元的偏移量由地址指標暫存器BX,BP,S,D其中之一提供,則稱該運算元為暫存器間接定址方式。其中,(BX)、(BP)稱為基址分量,(SD、(DD)稱為變址分量。

3.基址定址與變址定址

如果記憶體運算元的偏移量由基址分量與位移量分量相加得到,則稱該運算元為基址定址方式;如果記憶體運算元的偏移量由變址分量與位移量分量相加得到,則稱該運算元為變址定址方式。

4.基址變址定址

如果記憶體運算元的偏移量由基址分量、變址分量、位移量分量三種分量相加得到,那麼稱該運算元為基址變址定址。其中,基址分量由(BX)或(BP)提供,變址分量由(SD或(D)提供。