這邊的解碼並不是指邏輯電路層的解碼處理(但如果開發者專業背景有涉及這最底層的硬體設計知識,對於開發相當有幫助),而是指指令碼如何透過模擬器來正確解譯(這指令要以啥方式來解讀,然後它要做那些事情).
早在8bits CISC微處理器像 z80 或是 6502 , 解碼是相當簡單的事情,因為它們的格式相當固定簡單,通常是一個byte的opcode搭配上後面幾個bytes的參數合成一個最基本的指令,
[opcode][參數1][參數1] (共3byte)
[opcode][參數1][參數2] [參數3](共4byte)
每一次抓取指令單元,先抓地一個byte,判讀opcode,看看後面還要抓幾個byte構成完整指令,之後pc更新(加上opcode和參數所佔的空間之後的位址就是下一個要抓的opcode),再繼續相同的流程.
目前看過三種流程的判讀方式,用 if elseif elseif ..... esle 許多條件判斷來做為每次處理的方式
if ( opcode 是否為 #1)
{
執行#1的處理
}
elseif ( opcode 是否為#2 )
{
執行#2的處理
}
.
.
.
.上頭似乎是最差的方式....不過隨著後來cpu指令格式的複雜,有時後類似的處理是必要的
接著使改用 switch (opcode) { case #1: ...... 的方式
switch ( opcode)
{
case 0:
執行 #0 的處理
break;
case 1:
執行#1的處理
break;
.
.
.
.
}
還有一種跟switch很類似 , 就是 array 裡頭放置 function 的進入 point ,以8 bits 的 cpu來說, opcode為1byte,共有255種可能,宣告一個array放入對應的function進入點,解碼opcode和處理只要呼叫 array[opcode編號] 即可.
效能上 [通常] 以switch或是 function array 會比較好,但實際處理效能,可能還是得測試,撇開校能比較 , function array 的處理概念相對是比較進階一點的方式.
很多時候單一opcode還不夠,某些指令會由主opcode跟子opcode所構成,第一個opcde跟你說你可能接下來會做哪些事情,第二個子opcode才明確跟你說是哪些事情中的第幾件事情.
8bits cise 微處理器相對來說解碼簡單很多.
而ARM的解碼則相對複雜 !
沒有留言:
張貼留言