[請益] CPU指令解碼的解譯優先順序

看板Soft_Job作者 (.)時間12年前 (2013/04/20 22:12), 編輯推噓3(3015)
留言18則, 8人參與, 最新討論串1/1
https://dl.dropboxusercontent.com/u/61164954/homepage/files/20130420/arm.png
覺得很奇怪的是,記得我以前上課的時候, 老師有說cpu一定會有某些特定的位元組來做指令的區分, 不可能有衝突的可能,按照這個說法如果我們軟體讀取資料做解譯, 我們也只要對幾個特定的BIT做mask,然後比對是否符合特定的數值, 就可以知道資料是什麼指令,該用什麼方式去解讀,因此我們可以用好幾個 if ( (ins & 0x?????? ) == 0x?????? ) { //某個指令 } else if (....) { //某個指令 } else if (....) { //某個指令 } ...... 判斷來寫出解譯器,不過實際上我卻發現會因為判斷前後順序的不同, 導致最後解出不同的指令,很奇怪的問題... 還是我的觀念有誤? 又另外我要怎麼知道判讀的前後優先順序? 我抓到的DataSheet 只有把所有指令格式列出, 但是它並沒有說明cpu會優先用哪種格式去做解讀. 實際上判讀的前後順序,某些少部分情況下真的會影響到結果. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.79.227

04/20 22:26, , 1F
仔細看一下衝突的兩個指令集格式,還可以再細分其不同
04/20 22:26, 1F

04/20 23:16, , 2F
啊不就 op code = =
04/20 23:16, 2F

04/21 08:08, , 3F
不會是在說 lsl 跟 mov 這種例子吧
04/21 08:08, 3F
後來想一想,得到的結論是使用特定BIT做mask,檢查mask後是否符合特定的數值, 這種做法的確有前後順序需要處裡的問題,似乎是看mask的數值, 越小的要留到越後面去解,RISC的cpu不知道, CISC的arm在寫解譯器或是模擬器就要注意到. 不過後來想想這些問題,丟在這裡應該也很難獲得比較正確結論, 還是多靠自己好了. ※ 編輯: erspicu 來自: 61.70.79.227 (04/21 12:26)

04/21 19:14, , 4F
建議你看一下白算盤或紅算盤,CPU解OP碼不是用軟體解的
04/21 19:14, 4F
當然不是用軟體,但是用軟體也可以,不然就不會有解譯跟模擬器了.

04/21 19:21, , 5F
cpu都是用多層decoder對不同欄位解碼產生模組選擇與控制
04/21 19:21, 5F

04/21 19:25, , 6F
訊號.看該CPU的指令集手冊才是正解,disasm會看錯譯錯嗎?
04/21 19:25, 6F

04/21 19:34, , 7F
解碼電路通常都全解,IF-then-else易犯片面覆蓋的不週密錯
04/21 19:34, 7F

04/21 20:08, , 8F
ARM的opcode的bit長度不一 不是看某幾個bit就能判斷的
04/21 20:08, 8F
這個問題我也想過,所以disasm會讓你選擇用什麼方式去解讀,有些還auto模式自行判斷, 比較好奇的是auto是靠什麼機制的,最後猜測是它是解譯器兼模擬器動態判斷. ※ 編輯: erspicu 來自: 61.70.79.227 (04/21 21:09)

04/21 23:07, , 9F
沒有ELF很難直接看出是Thumb還是ARM指令集
04/21 23:07, 9F

04/21 23:09, , 10F
除了依據最低bit判斷外, 平常branch後有X 就會自動切
04/21 23:09, 10F

04/21 23:10, , 11F
如果程式正常一步一步跑 BLX,BX就會自動切換指令集模式,
04/21 23:10, 11F

04/21 23:11, , 12F
如果碰到異常狀況, 像stack overflow蓋到備份的LR值
04/21 23:11, 12F

04/21 23:12, , 13F
會造成PC跳到奇怪的地方. 有可能目前指令集模式看不出來
04/21 23:12, 13F

04/21 23:13, , 14F
就會有CPU undefined instruction exception
04/21 23:13, 14F

04/21 23:19, , 15F
CPSR有個T flag就是指說目前CPU是不是以Thumb mode執行
04/21 23:19, 15F

04/21 23:59, , 16F
好奇問一下?想做disasm嗎?這不是已有工具?聽說有案子出錢
04/21 23:59, 16F

04/22 00:06, , 17F
用此法想抓盜拷,但此法足以證明嗎?很想知道是想做甚麼?
04/22 00:06, 17F
先實作DISASM後,確認無誤後,朝向CPU模擬器實作,最後再實作gba的相關功能部分, 想嘗試寫看看gba模擬器,不過我的硬體底層背景很弱,程式倒不是太大問題, 只是缺少相關知識背景,得補很多東西,也許中途就因為缺乏動力放棄掉了也不一定, 純好玩,所以萬不得以不太想靠其他opensources的東西去port,這就跟原來用義不同了. ※ 編輯: erspicu 來自: 61.70.79.227 (04/22 00:30)

04/22 12:28, , 18F
還是可以參考 qemu 之類的檢視一下自己的錯誤囉
04/22 12:28, 18F
文章代碼(AID): #1HSg8tp4 (Soft_Job)