用于組成計算機程序、指示計算機硬件執行某項運算或操作功能的命令叫做指令,在計算機内部它是用一定的二進位串來表示的。一台計算機支持(或稱使用)的全部指令構成該機的指令系統。指令系統對計算機用戶和計算機廠家都有着非常重要的影響。指令是用戶設計計算機程序的最小功能單位,計算機廠家需要在計算機硬件系統中實現每一條指令的功能,指令系統直接與計算機系統的運行性能、硬件結構的複雜程度等密切相關,它是設計一台計算機的起始點和基本依據。
要确定一台計算機的指令系統并評價其優劣,通常應從如下4個方面考慮: (1) 指令系統的完備性,常用指令齊全,編程方便; (2) 指令系統的高效性,程序占内存空間少,運行速度快; (3) 指令系統的規整性,指令和數據使用規則統一簡單,易學易記; (4) 指令系統的兼容性,同一系列的低檔計算機的程序能在新的高檔機上直接運行。
指令的格式設計指令系統的核心問題是選定指令的功能和格式。指令的格式與計算機的字長、存儲器容量和讀寫方式、支持的數據類型、計算機硬件結構的複雜程度和追求的運算性能等有關。 通常情況下,一條指令要由如下兩部分内容組成:
第一部分,是指令的操作碼。操作碼用于指明本條指令的運算和操作功能,例如,是算術加運算、減運算還是邏輯與運算、或運算功能,是否是讀、寫内存或讀、寫外設操作功能,是否是程序轉移和子程序調用或返回操作功能等,計算機需要為每條指令分配一個确定的操作碼。
第二部分,是指令的操作數地址,用于給出被操作的信息(指令或數據)的地址,包括參加運算的一個或多個操作數所在的地址,運算結果的保存地址,程序的轉移地址、被調用的子程序的入口地址等。 在一條指令中,如何安排指令字的長度,即使用多少個二進制位(bit)表示一條指令,又如何分配指令字中這兩部分所占用的位數(長度),如何安排操作數的個數,如何表示和使用一個操作數的地址(尋址方式),是設計指令的重要問題。
操作碼的組織與編碼指令字的長度,多數情況下就确定為計算機的字長,即一條指令占用計算機的一個字,由幾個字節組成,例如2、4、6、8個字節,但并不一定要求所有的指令的字長都相同,例如,一個計算機字中,可以存放幾條很短的指令,長的指令也可能占用多個計算機字,目的在于提高資源利用率。從對指令操作碼的組織與編碼所選用的方案分類,一般分為以下2種處理情況。
(1) 定長的操作碼的組織方案,在當前多數的計算機系統中,一般都在指令字的最高位部分分配固定的若幹位(定長)用于表示操作碼,例如8位,它有256個編碼狀态,故最多可以表示256條指令。這對于簡化計算機硬件設計,提高指令譯碼和識别速度很有利,當計算機字長為32位或更長時,采用這種操作碼的組織方案。
(2) 變長的操作碼的組織方案,當計算機的字長與指令長度為16位或8位時,單獨為操作碼劃分出固定的位數後,留給表示操作數地址的位數就會嚴重不足。為此設計時使一些位(bit)在不同的指令中有不同的作用,例如,在一些指令中,這些位用作操作碼,而在另外一些指令中,這些位用作操作數的地址,則不同指令的操作碼長度就會不同。 設計時盡量為那些最常用(程序中使用頻率高)、用于表示操作數地址的位數要求又較多的指令,适當少分配幾位操作碼(當然能表示的指令條數也就少);而對那些表示操作數地址的位數要求較少的指令多分配幾位操作碼;對那些無操作數的指令,整個指令字的全部位都用作操作碼,力争在比較短的一個指令字中,既能表示出比較多的指令條數,又能盡量滿足給出相應的操作數地址的要求。
操做數的類型從用到的操作數個數區分,有如下4種情況: (1) 無操作數指令,有的指令不涉及操作數,或使用約定的某個(些)操作數,既已約定則沒有必要再在指令中加以表示,稱這類指令為無操作數指令,它僅有操作碼部分,例如停機指令、空操作指令、關中斷指令、堆棧結構的計算機系統中對堆棧中數據運算的指令等。
(2) 單操作數指令,有些指令隻用一個操作數,必須在指令中指明其地址,如一個寄存器内容增1或減1運算的指令;或還使用約定的某個操作數,既已約定則無需再在指令中加以表示,如完成從(向)外設讀(寫)數據的指令,就可以隻在指令中指明該外設地址,而把接受(送出)數據的通用寄存器約定下來。此外,在短字長的、采用單個累加器的計算機中,已約定目的操作數(如被加數、被減數等)和保存計算結果都使用唯一的那個累加器,指令中隻需指定另外一個源操作數即可。稱上述這些指令為單操作數指令。
(3) 雙操作數指令,對于常用的算術和邏輯運算指令,往往要求使用兩個操作數,需分别給出目的操作數和源操作數的地址,其中目的操作數地址還用于保存本次的運算結果。在寄存器與主存儲器之間完成數據傳送的指令,也需要給出寄存器編号和主存儲器地址。稱這類指令為雙操作數指令。 (4) 多操作數指令,另外一些指令可能使用多個操作數,如3個操作數,其中兩個操作數地址分别給出目的操作數和源操作數的地址,第三個操作數地址用于指出保存本次運算結果的去處,可以稱這類指令為三操作數指令;在有些性能更高的計算機(甚至PC機)中,還有在指令中使用更多個操作數地址的指令,用于完成對一批數據的處理過程,如字符串複制指令,向量、矩陣運算指令等,稱這類指令為多操作數指令。 上述4種情況中的前3種,由于其指令字長可以相對較短,執行速度較高,計算機硬件結構可以相對簡單等優點,在各種不同類型的計算機中被廣泛應用;相對而言,最後一種更多地用在字長較長的大中型計算機中。
操作數的來源去向和地址安排這裡說的操作數的來源、去向,是指在指令中操作數要從哪裡讀來、寫向哪裡去。不同的指令使用不同數目、不同來源、不同用法的操作數,必須有辦法盡量把它們統一起來,并安排在指令字的适當位置(字段)。 (1)操作數的來源、去向可分為如下3種情況。
操作數的第一個來源、去向,可以是CPU 内部的通用寄存器,此時應在指令字中給出所用的寄存器編号(寄存器名),通用寄存器的數量一般為幾個、十幾個,一、二百個,故在指令字中須為其分配2、3、4、5或更多一點的位數來指明一個寄存器;該寄存器中的内容,可以是指令運算用到的數據,也可能用作為一個操作數或者指令的地址,或計算主存儲器地址的相關信息。
操作數第二個來源、去向,可以是外圍設備(接口)中的一個寄存器,通常用設備編号、或設備入出端口地址、或設備映像地址(與内存儲器地址統一編址的一個設備地址編号)來表示。 操作數的第三個來源、去向,可以是内存儲器的一個存儲單元,此時應在指令字中給出該存儲單元的地址。由于許多計算機用到的内存地址的位數,就是一個機器字的長度,要在一個指令字中既給出操作碼,還要直接給出這一内存地址是困難的;而且,還有采用多種不同方式讀寫内存的需求;再考慮到尚需把其它數據來源、去處等統一安排在指令字的操作數地址字段,這就需要找到解決這些需求的完整方案。 指令中使用的基本數據類型,通常包括邏輯類型(bit),整數類型(integer),浮點數類型(floating)等,通常需要結合指令的操作碼來判斷數據類型并完成相應的運算處理。
指令的分類一台計算機的指令系統往往由幾十條到幾百條指令組成。可以從不同的角度對這些指令進行分類。常用的還是按指令所完成的功能進行分類。 (1) 算術與邏輯運算類指令,它通常完成對一或兩個數據的算術運算或邏輯運算功能。不同檔次、不同性能的計算機所能加工、運算的數據類型(整數、浮點數、十進制數等)和支持的運算功能(加、減、乘、除、變符号等)的完備程度可以有所差異,但一般都須給出算術與邏輯運算的結果,以及結果的有關特征。
(2) 移位操作類指令,包括算術移位、邏輯移位、循環移位三種,用于把指定的一個操作數左移或右移一(多)位。
(3) 數據傳送類指令,用于實現通用寄存器之間、通用寄存器與内存存儲單元之間、内存不同的存儲單元之間、通用寄存器與外圍設備(接口)之間(有些場合也可以單獨劃分為輸入/輸出指令)的數據傳送功能。從内存儲器和外圍設備(接口)操作性質的不同,又可以區分為讀和寫兩種操作,它指明數據傳送的方向。 (4) 轉移類指令,用于解決變動程序中指令執行次序的需求。 轉移指令,是一種改變程序中指令執行次序的指令。程序中的指令,大部分是按指令排列的自然次序順序執行,但有時候又要求不執行鄰接的下一條指令,而是轉移到另一段程序入口處開始執行,此時就會用到一條轉移指令。轉移指令又被區分為無條件轉移和條件轉移兩類,二者的相同之處是都必須在指令中給出轉移地址,不同之處是,條件轉移指令還必須在指令中給出判斷是否執行轉移所依據的條件,僅在條件為真時才執行轉移,否則順序執行;而無條件轉移指令必定執行轉移。 (5)子程序調用指令與返回指令,可以被理解為一種特定的轉移指令,二者要配合使用,通過子程序調用指令,使一段被稱為子程序的特定程序段投入運行,而該程序段的最後一條指令,一定是一條子程序返回指令,它會使子程序運行結束後,确保轉移回到排在子程序調用指令之後的那條指令處接着執行。而一般的轉移指令,并不涉及再返回來的問題。再深入一步講,子程序又可以被分為用戶自己編寫的子程序和軟件系統提供的子程序兩大類,這後一部分又被稱為訪問系統程序(訪管)指令、陷阱(TRAP)指令。 (6) 特權指令,是指僅用于操作系統或其它系統軟件的指令,為确保系統與數據安全起見,這一類指令不提供給用戶使用。這一類指令主要用于管理與分配系統資源,包括改變系統的工作方式,完成任務的創建或切換,變更管理存儲器用的段表和頁表中的内容等。特權指令對多用戶或多任務系統是必要的。 (7) 其它指令,如動态停機指令、空操作指令、置條件碼指令、開中斷指令、關中斷指令、堆棧操作指令等,用于完成某些特定的處理功能。
指令周期及對計算機性能的影響簡單介紹有關的幾個基本概念。 通常把執行一條指令所用的時間叫做指令周期。一個指令周期往往要包含幾個執行步驟,例如可能包括讀取指令、指令譯碼和讀寄存器組、ALU執行運算、讀寫内存或接口、數據寫回寄存器組這5個步驟,就是說,要依次經過這幾個步驟的操作才能完成一條指令的具體功能,如圖4.1所示。
圖4.1 指令的5個執行步驟
(1)讀取指令的步驟是每一條指令都必須執行的,所完成的功能對所有指令都相同;
(2)指令譯碼步驟完成的功能對多數的指令是類似的,例如判斷指令類型、讀寄存器組等; (3)ALU執行的步驟所完成的是數據計算或者地址計算功能,對不同指令會有所區别; (4)讀寫内存或接口這一步驟,隻被用于讀寫内存或者讀寫接口的指令; (5)數據寫回步驟,完成把ALU的計算結果,或從内存,或從接口讀來的數據寫入寄存器組。 每條指令都是在取指——譯碼——執行的循環中完成的。當然,在一條指令執行的過程中,還一定要計算出下一條指令的地址并保存,以保證程序(指令序列)得以自動連續執行。 在計算機内部,從如何選擇、處理這5個執行步驟的角度來看,可分為如下3種方案,每個方案對指令執行速度和計算機硬件實現的複雜程度等有較大影響。 第1種方案,不管指令功能的複雜程度,讓所有指令都經過這5個步驟完成,即全部指令都選用同一種指令周期,從而構成單指令周期的CPU系統。此時必須依照功能最複雜、執行用時最長的指令的運行要求來确定指令周期長度,否則系統運行會出錯。對那些功能簡單,隻用更少執行步驟就能完成的指令,就勢必遇到一些無操作功能的執行步驟,造成執行時間上的浪費,降低了系統的運行效率。此外,這個方案不利于在一條指令執行過程中的硬件部件的分時共享,系統資源利用率最低。 第2種方案,依據不同指令功能的繁簡程度來分别确定各自的指令周期,指令需要幾個執行步驟完成就為它分配幾個步驟,此時可能有分别用2個步驟、3個步驟、4個步驟或5個步驟完成的指令,此而構成多指令周期的CPU系統。這一方案明顯的優于前一方案,指令執行速度和硬件部件的資源利用率更高,是一種比較實用的方案。 第3種方案,屬于指令流水線的CPU系統,它的思路在于盡可能地在指令的每一個執行步驟都啟動一條指令,使程序中幾條相鄰指令的執行時間盡可能的重疊起來,就像工業生産中的流水線,故稱指令流水,它與前2種方案有明顯區别。前2種方案實現的是指令的串行執行,即前一條指令完成之前不會啟動下一條指令,在任何時間都隻有一條指令處在運行中,當确定采用5個步驟的指令流水線時,理想情況可能有5條指令各自處在不同的5個步驟中。這種方案會使得硬件設計與實現更複雜一些,但帶來了更高的性能價格比,是目前被廣泛選用的、更加實用的方案。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!