要解碼arm的指令,跟之前z80或是6502不同,由於沒有一個明確的opcode告知,我們能做的是判斷指令為何種格式,走這種途徑的處理方式當然只能用很多 if else 連續判斷一些條件,來拆解格式,每種格式在特定的幾個地方都會有固定不變的位元設定,我們只要按照那些於特定地點的位元特徵,就可以拆解判斷出為何種格式的指令.
通常如果沒有對ARM每一個指令格式有深入了解,第一個會遇到的問題就是,某些指令格式似乎會有模稜兩可的問題,這也是解ARM指令最討厭的地方,也是入門者剛開始會遇到的最主要問題.
cpu指令一定不會有一個指令,各自表述的情況發生,那ARM是怎麼回事?
其實關鍵就在於不能光看格式表的資料,還得深入指令各位元相互存在的關係,也就是說雖然某幾個位元不是固定位元,理論上填入0或是1都可以,但實際上某幾個位元會跟著某指令某位元的設定而有特定的形式,如果沒有按照幾個特定形式,它就轉成別的指令格式了.
也就是說這些看似模凌兩可的指令格式,其實都有嚴謹的關係規則,剛好避開重覆解釋的衝突.
這種做法是滿巧妙的,但相對的程式處理自然複雜,需要對指令格式的規則有深入的了解,用if else 好幾個複合而且連續的判斷去拆解出正確的解指令格式解碼.
這邊列出期中幾個arm 32bits的特殊衝突狀況...
- Single Data Transfer與Undefined 按照格式表會產生重覆衝突, 但 Single Data Transfer bit 25 與 bit 4 之間的可能關係,剛好會避開Undefined的重覆衝突.
- Data Processing與PSR Transfer 按照格式表會產生重覆衝突,但Data Processing中bit 24~24操作碼的TST.TEQ.CMP.CMN必定得設定bit 20為1,若bit 20不為1,則釋譯為PSR Transfer(MRS或MSR).
- Single Data Swap 與 Halfword Data Transfer 按照格式表會產生重覆衝突,但 Halfword Data Transfer的 bit 6與5 若為 00 則解釋為Single Data Swap .
thumb 16bits的特殊衝突狀況.....
- Format 1: move shifted register 與 Format 2: add/subtract 兩指令格式有重疊,格式1 bit(12,11)不能為 (1,1) , 以此來區分
- Format 16: conditional branch 與 Format 17: software interrupt 格式16 cond 不能為1111 , 以此來區分,
但......也有比較快的方式,可以避開始用一堆if else...下面繼續談到
沒有留言:
張貼留言