指令集架構的設計

ISA(instruction set architecture,指令集架構)
程式設計師或是翻譯器撰寫者所能夠看得到的機器部份
包括運算種類,暫存器個數,定址空間,條件碼,…等
ps:不包括快取記憶體的組織與指令管線的深度等實作相關細節

…………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………….

指令集設計的考量因素

1指令集所提供的運算種類
必須是functionally complete(功能完整),具備足夠的指令,才可讓使用者完整表達計算過程
而在電腦指令集上至少需指供3種運算,才算完整的指令集:
 data operation instruction(資料運算指令)
 data transfer instruction(資料搬動指令)
 flow control instruction(流程控制指令)
其他指令則是設計上的捨取
補充:若能找出功能完整的最小集合,就可用少工具完成工作
ex:只要有AND,OR,NOT三種即可提供完整的布林運算功能
ex:只要有循序,選擇,迴圈三種基本指令即可設計出任何功能的高階語言

2 CPU內部儲存運算元方式:
stack(堆疊):用postfix expression(後序運算式)可讓計算方式變簡單,但存取效率差
acc(累加暫存器):運算電路簡單,但只有1個,在運算時對memory存取次數較多
general purpose register(一般目地暫存器):數量多可有彈性的運用,大多數機器採用

3指令中指出的運算元個數
儲存運算元方式會影響運算元個數
stack:使用零個運算元格式,因為運算元與運算結果都固定在stack中
ACC:使用單一運算元的格式,因為其中一個運算元與運算結果會固定ACC中
general purpose register:有兩個或三個運算元格式

4指令中允許的運算元位置:
位置會影響存取運算元的效能,設計上有:
暫存器對暫存器:load-store architecture(載入與回存架構)
暫存器對記憶體
記憶體對記憶體
對於memory中,運算元的定址方法有:
direct addressing(直接定址法)
indirect addressing(間接定址法)
relative addressing(相對定址法
immediate data addressing(立即資料定址法)
indexed addressing(索引定址法)

5指令中如何指定運算元型態與大小:
型態與大小決定存取的次數,一般設計上有兩種
 運算碼:可靠度差,大多電子計算機用
 標籤:可靠度佳,電路需要特殊設計

6其他
指令集的條件碼:是否給程式設計師用或隱含
指令集的consistency(一致性):若有此設計,則容易學習且撰寫不易出錯

………………………….

指令集設計步驟
1分析出主要應用領域
2根據應用領域的性質與特徵,決定需要提供的特殊功能
3將特殊功能對映成一低階指令
4根據指階指令發生次數,決定使用頻率
5使用頻率高且執行時間長的指令,根據amdahl’s law進行優化
6分析指令是否為可接受的組合語言階層,最後形成指令

好的指令集架構包括:
1指令集大小與複雜度:最好適中,需考量RISC和CISC差異
2功能完整性與效率:可讓演算法轉換成一個機器語言程式,並能有效率執行
3設計一致性:使用的定址模式與條件碼必須一致,所有指令皆可使用

好的指令集架構需考量:
1 application program development:需要可讓程式設計師在各應用領域方便地撰寫應用程式
2 compiler design:可容易將高階語言指令轉換成機器語言指令,並對特殊功能最佳化處理與設計
3 assembly language programming: 可對應到組合語言指令,並根據需要撰寫各功能的組合語言程式
4 hardware implementation: 可實作出電路並有效率地執行這些指令,根據不同加權予特別設計


…………………………………………………………………………………………………………………………..
…………………………………………………………………………………………………………………………..

CISC vs RISC


CISC(Complex Instruction Set Computer,複雜指令集電腦)
設計哲學:指令集是撰寫程式的工具,一旦工具越多且功能越強,則更能有效率地設計程式
觀念:提供複雜的指令,讓完成一個工作所需的IC(指令個數)能夠減到最少提昇效率
優點:撰寫組合語言方便,擁有大量指令可完成複雜工作
缺點:CPI與CT較大
管線作業:普通
特點:翻譯器設計簡單,硬體電路複雜,較少register
指令特性:指令多且複雜,格式與長度不固定
適合:複雜的工作
ex:Motorola6800,DEC VAX,IBM370

RISC(Reduced Instruction Set Computing,精簡指令集電腦)
設計哲學:提供少數及常用且簡單的指令,並對指令進行特殊設計,在大部份的情況下會有較佳的效率
觀念:將常使用的簡單指令特別使用硬體的來製作,以提升執行效率,減少CPI
優點:擁有少量指令且功能簡單,CPI藉由管線作業變小,CT藉由減少解碼和產生控制信號時間變小
缺點:IC多
管線作業:可得到最大好處
特點:翻譯器設計複雜,硬體電路簡單,較多register
指令特性:指令少且簡單,格式與長度固定
適合:簡單的工作
ex:SUN SPARC,Apple PowerMac,IBM RS系列

ps:
RISC比CISC更適合用在IA(intelligent appliance智慧型家電)
因為該此類產品內部只需功能相對簡單的微處理器,指令也相對少
ps:
現今的cpu通常採用RISC和CISC混合式設計


精簡指令集電腦特性
因為程式中有較多的IC,因此必需減少CPI和CT,所以有以下特性:
 管線作業架構:讓CPI接近1
 single machine cycle(單一機器週期):提升指令效能
 載入與回存架構:只允許load instruction和store instruction存取主記憶體資料,來盡量避免用到主記憶體
 register file(暫存器檔案):提供極多register,讓指令盡量在register存取資料,減少memory的存取次數
 硬體線路控制:CU(控制單元)使用,以減少一道指令在執行所需的時間,以提昇整體執行效能
 固定長度與格式的指令:簡化指令週期中IF和ID動作,使解碼電路複雜度變低,減少CT
 簡單的定址模式:提供暫存器對暫存器與少數簡單的定址模式,減少指令執行的記憶體存取次數
 最佳化的翻譯器:用最佳化技術使程式中指令個數盡量減少,並處理管線危機
 coprocessor(浮點運算協同處理器):因單一機器週期不同,為不影響管線作業效能,另外使用硬體電路來完成
 快取記憶體:可減少主憶體的平圴存取時間,直接影響計時週期個數(CPI*IC)和CT

…………………………………………………………………………………………………………………………..
…………………………………………………………………………………………………………………………..

指令格式
機器指令的格式通常為:[運算碼欄位][定址指示欄位][運算元欄位]
ps:在IF與ID上,用固定長度格式較簡易,用變動長度格式較複雜

………………………….

運算碼欄位:內含二進制編碼的opcode(operation code,運算碼)
1中央處理器在指令週期的ID階段,根據opcode的內容就可以知道要執行那一種運算
2欄位長度和指令集大小有關
3編碼方式:有欄位長度可以是固定或變動長度的編碼設計,如下
單一運算碼欄位編碼:使用相同長度的運算碼,若有n個指令則需ceil(log2(n))個位元的運算碼欄位
   ex:54種不同指令,則欄位長度為6bit
   ex:op code欄位為5bit,則此機至多可提供2^5=32種不同的運算
多個運算碼欄位編碼:長度不一定,但會增加解碼電路的複雜度
霍夫曼編碼:對經常使用的指令進行特殊設計,考慮使用機率可以得到平圴長度最小的運算碼編碼
  ex:有6指令,機率分別為p1=0.4 , p2=0.3 , p3=0.1 , p4=0.08 , p5=p6=0.06
  經編碼後各指令運算碼為p1=0 , p2=10 , p3=1111 , p4=1110 , p5=1100 , p6=1101
  平均長度=1*0.4 + 2*0.3 + 4*0.1 + 4*0.08 + 4*0.06 + 4*0.06=2.2bit

………………………….

運算元欄位:存放運算元的位址
1欄位大小和主記憶體的定址空間大小有關
2欄位個數多寡會影響機器指令的長度
3算術運算指令格式,需明顯指出運算元的個數,可分成:
 四位址指令:[運算元位址| 運算元位址| 運算元位址| 下一道指令位址]
 機器指令目前沒不使用,但微指令格式中常用
 三位址指令:[運算元位址| 運算元位址| 運算元位址],而下一道指令位址放在program count
 磁蕊記憶體出現才開始有三位址指令
 雙位址指令:[運算元位址| 運算元位址]
 單位址指令:[運算元位址]
 一又二分之一位址指令
 零位址指令:也稱stack architecture(堆疊結構),算術運算指令中不必指定運算元所在
 暫存器對暫存器指令(載入與回存架構):優點是可減少到memory存取運算元的次數提高效率

………………………….

定址指示欄位:用來指示運算元資料的定址模式
addressing mode(定址模式)用途:
1用來推算出運算元的EA(effective address,有效位址),或是取得運算元的方法
2定址模式豐富,會減少IC,但可能增加CPI和CT,若定址模式簡單則相反

五大類addressing mode:
direct addressing(直接定址法)/absolute mode(絕對定址法):運算元位址=存放在運算元欄位
  1最簡單的定址模式,只需要到memory存取一次即可得到運算元
  2使用此模式的程式執行時,不允許隨意搬動程式位置
  3運算元欄位的長度要配合memory定址空間大小,若欄位為nbit,則可提供2^n的定址空間
  4欄位的位址可指到,flag,register,memory,因此有分成flag direct addressing,register direct addressing,memory direct addressing
indirect addressing(間接定址法):運算元位址=存放在memory或register中,然後在放到運算元欄位中
  1常用於subroutine linkage(副程式之間的連結),表示副程式之間的dynamic linking(動態連結)
  2提供極大的彈性,但會使程式的執行效率變差
  3必須經過兩次存取,第一次先存取到有效位置,第二次在用有效位置取得運算元
  4可細分為:
 register indirect addressing:適合用於存取連續位址的資料
 memory indirect addressing
relative addressing(相對定址法):運算元位址=運算元欄位的值+register所指的memory起始位址
  1最普遍的定址模式
  2允許程式在執行可隨意搬動位置
  3比直接定址的執行效率差
  4可明確或隱含的放在指令中,因此有二種:
 base address relative(基底相對定址):相對位址是指運算元相對於程式的起始位置
 program counter relative(程式計數相對定址):相對位址是指運算元相對於下道指令的位址
immediate data addressing(立即資料定址法):運算元本身放於指令的運算元欄位中
  1可視為program counter relative,但相對位址必須是0
  2執行效率最佳,只能存取較小的常數資料
indexed addressing(索引定址法):運算元在主記憶體的實際位址可由一個index register(索引暫存器)的內容所更改
 1適合對連續位址的運算元進行存取,常用於陣列資料存取
 2需要較多的位置計算
 3需與其他位址法一起合用,可產生如下模式:
 index memory direct(記憶體直接索引):運算元位置=指令中運算元欄位的值+索引暫存器的值
 preindexed register indirect(暫存器間接先索引):運算元位置=register的值+索引暫存器的值,最後使用間接定址法求值
 postindexed register indirect(暫存器間接後索引):運算元位置=使用間接定址法求出register的值,最後在加上索引暫存器的值
 preindexed memory indirect(記憶體間接先索引):運算元位置=指令中運算元欄位的值+索引暫存器的值,最後使用間接定址法求值
 postindexed memory indirect(記憶體間接後索引):運算元位置=使用間接定址法求出運算元欄位的值,最後在加上索引暫存器的值
 indexed base address relative(基底相對索引):運算元位置=base address relative的結果+索引暫存器的值
 indexed program counter relative(程式計數相對索引):運算元位置=program counter relative的結果+索引暫存器的值
ex:設@(m_addr)=value表示記憶體位置為m_addr上的資料為value
而現在記憶體為 @(250)=750,@(255)=530,@(300)=90,@(305)=860,@(530)=395,@(750)=440,@(755)=950
若有個單一位置指令為[load][250],索引暫存器=5,基底暫存器=50
用direct addressing,則運算元位置=運算元欄位上的250,所以運算元=位置為250的值=@(250)=750
用indirect addressing,則運算元位置=m_addr為250的值=@(250)=750,所以運算元=位置為750的值=@(750)=440
用base address relative,則運算元位置=運算元欄位上的250+50=300,所以運算元=位置為300的值=@(300)=90
用immediate data addressing,則運算元位置=無,所以運算元=運算元欄位上的250
用index memory direct,則運算元位置=運算元欄位上的250+5=255,所以運算元=位置為255的值=@(255)=530
用preindexed memory indirect,則運算元位置=m_addr為250+5的值=@(255)=530,所以運算元=位置為530的值=@(530)=395
用postindexed memory indirect,則運算元位置=m_addr為250的值+5=@(250)+5=755,所以運算元=位置為755的值=@(755)=950
用indexed base address relative,則運算元位置=運算元欄位上的250+5+50=305,所以運算元=位置為305的值=@(305)=860


………………………………………………………………………………………………………………………….
………………………………………………………………………………………………………………………….

其他指令

MIPS(microprocessor without interlocking pipe stages)的指令
格式有3種:
format1,32bit [6:opcode][5:src1][5:src2][5:dest][5:shift][6:function]
 使用暫存器直接或間接定址模式
format2,32bit [6:opcode][5:src][5:dest][16:immediate constant]
 使用immediate data addresing或indexed addresing
format3,32bit [6:opcode][26:jump target]
  使用direct addresing

NOP (no operation instruction不運算指令)
浪費中央處理器時間,不會對執行狀態有任何改變
主要應用有
1早期可讓機器指令撰寫容易維護
2可讓程式正確地在指令管線中執行,防止structure hazard(結構危機)
3配合程式互相協調,可提供任意長度的延遲時間

MMX(Multi-Media eXtension,多媒體延伸指令集技術)
由Intel所發展
做法: 對CPU的暫存器特別設計,加上57組延伸指令
用途:加強CPU對圖形,影像,聲音等資料處理的速度,讓電腦在處理多媒體與網路通訊方面能有更良好的表現
特點:改變過去CPU處理傳遞資料的方式
已往即使是零碎資料,在傳遞時仍會佔用整個資料傳遞路線
現在MMX會將傳輸線路分割,並整合零碎資料,以便同時處理多筆類似資料,加速資料處理的速度
ps:含MMX技術的CPU,代表性產品是Pentium P55C