4.1.1指令的基本概念和指令的基本格式
操作碼:指明CPU進行什么操作。
地址碼:知指明CPU對誰進行操作。
PC:程序計數器,每執行一條指令會+1指向下一條指令。
指令的概念和基本格式:是指一台計算機執行某種操作的命令,一台計算機的所有指令的集合構成指令集,也叫做指令系統,位於計算機的硬件和OS層面。
不同計算機只能執行自己系統的指令,如Intel的x86架構,手機是ARM架構,因此手機App和電腦不互通。
4.1.2指令的分類
4.1.2.1按照地址碼數量分類
1)零地址指令:只給出操作碼OP,無顯式地址,有兩種情況:不需要操作數的指令,如空操作,停機,關中斷。零地址的運算類指令只用在堆棧計算機中,參與運算的兩個操作數隱含在棧頂和次棧頂。計算結果壓會棧頂,如棧運算的后綴表達式。
2)一地址指令:只有一個操作數,OP(A1) -> A1,如自加自減求反求補。或者需要兩個操作數但其中一個操作數隱含在寄存器如ACC中,(ACC)OP(A1) ->ACC。完成一條一地址指令需要訪存三次,取指令->讀A1->寫A1。
3)二地址指令:有兩個操作數,通常為算術運算和邏輯運算相關。(A1)OP(A2)->A1。完成一條一地址指令需要訪存四次,取指令->讀A1->讀A2->寫A1。
4)三地址指令:兩個操作數,通常為算術運算或者邏輯運算相關。(A1)OP(A2)->A3。完成一條一地址指令需要訪存四次,取指令->讀A1->讀A2->寫A3。
5)四地址指令:(A1)OP(A2)->A3。完成一條一地址指令需要訪存四次,取指令->讀A1->讀A2->寫A3,執行完指令后。程序計數器的值不是+1,而是指向下一條要執行的指令A4地址。
4.1.2.2按照指令長度分類
半字長指令,單字長指令,雙字長指令。這里半字長,單字長,雙字長是說指令長度是機器字長的多少倍。
有的計算機是定長指令字結構:所有指令長度都相同。
有的計算機是變長指令字結構:各種指令字長度不同
4.1.2.3按照操作碼長度分類
定長操作碼:所有指令的操作碼長度相同。容易設計但靈活性低。
可變長操作碼:各種指令的操作碼長度可變。使得控制器的譯碼器電路設計復雜,但是靈活性高。
4.1.2.4按照操作類型分類
數據傳送類型如LOAD,把存儲器的數據放到寄存器中,完成了主存和CPU之間的數據傳送;
算術邏輯操作如加減乘除等;
移位操作如邏輯移位和算術移位以及循環移位;
轉移操作如實現程序執行流如調用和返回會使得PC的數值改變;
輸入輸出操作如CPU寄存器和IO端口之間的數據傳送。
大類上,數據傳送是數據傳送類型,算術邏輯操作和移位操作是運算類操作,轉移操作是程序控制類操作,輸入輸出操作是輸入輸出類。
4.1.3定長操作碼格式
定長操作碼,指令在指令的最高位分配固定若干位表示操作碼,n位操作碼的指令最大可以表示2n位條指令,定長操作碼可以提高計算機指令譯碼和識別速度。
4.1.4可擴展操作碼指令格式
定長指令字結構+可變長操作碼 -> 擴展操作碼指令格式。
假設下列一種情況,指令字長16位,每個地址碼4位
三地址指令:
操作碼為16 - 4 * 3 = 4位,若全部用於三地址指令,則24 = 16條,若還需要設計其他指令如二地址和一地址以及零地址,需要把操作碼為1111的情況留作擴展操作碼使用,則三地址指令為0000~1110間15條。
二地址指令:
操作碼為8位,情況同上,只能1111 0000 ~ 1111 1110間15條指令。計算方式同上。
一地址指令:
操作碼為12位,情況同上,只能1111 1111 0000 ~ 1111 1111 1110間15位。計算方式同上。
零地址指令:
操作碼為16位,1111 1111 1111 0000 ~ 1111 1111 1111 1111間16位。此時不再需要留出一條作為擴展操作碼使用。當然了,若指令長位32位或者更長,操作碼還可以擴展的話,那就是1111 1111 1111 0000 ~ 1111 1111 1111 1110間15位了,情況以此類推。
關於擴展操作碼格式需要注意事項:
不允許短碼是長碼的前綴,如,二地址指令的操作碼前4位是1111,三地址指令的操作碼不能是1111,否則CPU就不能識別。
各指令操作碼不能重復,否則也會使得CPU無法識別。
關於擴展操作碼,CPU識別的過程:
這里仍然使用講義截圖,使得PC先指向0,假設16位長度指令,操作碼為4位二進制,地址碼為12位二進制。CPU可以識別到第一條指令操作碼是0000,是三地址指令,CPU中程序計數器(PC)識別到該程序是取變量a到ACC中,執行完畢PC+1;
此時要執行第二條指令,假設第二條指令是二地址指令且后續還有一地址指令,那么正常情況,操作碼應該是1111 0000 ~ 1111 1110,CPU會先識別到前四位是1111,再繼續識別后面四位,如果后四位不是1111而是0000 ~ 1110,則該指令是二地址指令,如果后面四位是1111,則是一地址指令1111 1111 0000 ~ 1111 1111 1111,若第二條指令操作碼變成1110 0000,因為1110與三地址指令的操作碼相同,CPU中PC就會把第二條指令讀取到前四位1110結束,不再讀取后面操作碼,當作三地址指令去執行,然而實際上地址碼只有8位,執行會出錯。
后續指令執行的過程也相同,可以自行畫圖推理。
通常情況下,執行頻率高的指令,會分配較短的操作碼,使得譯碼器譯碼和分析時間減短;執行頻率較低的指令,會分配較長的操作碼。
講義中還附上了另一種指令設計的思路
這里的設計思路,一地址指令A1中的1100 ~ 1110與A2中的0000 ~1111對應,A1中1111與A2中0000 ~ 1101對應。零地址指令同上。
這里還有一個需要注意的公式,對於擴展操作碼,假設地址長度為n,上一層留出m種狀態,下一層可以擴展出m * 2n種狀態。
求點贊!求鞭策!