注意上面的中的黃色箭頭是我按單步執行後,按了一下後,箭頭所在的位置,這時的r15的值是0x00000004,表示正在執行的指令的位址,當r15的值為0x00000000時,黃色箭頭你說在**呢,當然是在ldr那條指令那裡了,並且表示ldr指令並沒有執行。請大家再看,r0的值為什麼是0x0000000d呢,r0等於aaa+1,那麼aaa是不是就等於十六進製制的c啊,等於十進位制的12啊,為什麼會等於12呢,這就和r15暫存器有關了,待會執行到bx指令的時候再解釋,我再單步進入,看截圖:
大家只要看黃色的箭頭即可。接下去是執行bx指令了,bx指令是什麼東西呢,你們可以查閱相關資料,首先bx指令格式:bx rm ,指令功能,bx指令跳轉到rm指定的位址去執行程式,若rm的bit0為1,則跳轉時自動將cpsr中的標誌t置位,即把目標位址的**解釋為thumb**,如果為bit0位為0的話,則跳轉時自動將cpsr中的標誌t復位,即把目標位址的**解釋為arm**。
所以你先看看現在的r0的值是0x0000000d,bit0位為1,所以是把arm指令狀態跳轉到thumb指令狀態,那麼bx既然是一種跳轉指令,則應該是偶數啊,d等於13不是偶數呀,這裡我給你算算哈,當黃色的箭頭指向mov r1,,#12,時,此時r15暫存器的值肯定是0x0000000c了,因為bx指令也是種arm狀態下的指令嘛,所以,當黃色游標指向mov r1,#12時,r15的值是0x0000000c了,這時你應該清楚為什麼r0的值為0x0000000d了,就是c+1嘛,1只不過給個訊號,我的程式要從arm狀態跳轉到thumb狀態的程式中執行了。
所以請你猛看這裡cpsr暫存器中的t位:從0(arm狀態)變成1(thumb狀態)
怎麼驗證已經到thumb狀態了呢,請看我再次執行哈:
這張中的r15是0x0000000e,上張的r15是0x0000000c,相差為2,所以說明已經轉化成thumb狀態了,因為thumb每條指令占用2個位元組,16位。還有一點我想說明的是其實在你程式執行之前,每條指令的所對的pc值,是確定的,更為直觀點的說法是,黃色箭頭此時指向哪一條指令,這時的pc值你確定的,可以筆算的,注意全文所說的pc值就是r15暫存器的值。aaa只不過是乙個函式的名字,取啥名兒都無所謂,zhangsan也行啊,哈哈。
下面我想說說thumb指令狀態切換到arm指令狀態,原來和上述一樣,這裡我只貼個短小而精悍的**了:
[plain]
view plain
copy
area arm_to_thumb,code, readonly
entry
code16
start
ldr r0,=zhangsan
mov r3,#18
bx r0
code32
zhangsan
mov r1,#12
mov r2,#10
end
ARM指令狀態切換到Thumb指令狀態
注意上面的中的黃色箭頭是我按單步執行後,按了一下後,箭頭所在的位置,這時的r15的值是0x00000004,表示正在執行的指令的位址,當r15的值為0x00000000時,黃色箭頭你說在 呢,當然是在ldr那條指令那裡了,並且表示ldr指令並沒有執行。請大家再看,r0的值為什麼是0x0000000d...
thumb指令和arm指令
參考 一 為什麼乙個晶元需要thumb和arm兩套指令集 許多複雜的功能在複雜指令集 cisc 處理器上執行只需要單一的一條指令,即可,雖然可能有點慢,在精簡指令集處理器上可能需要多條指令,所以在精簡指令集 risc cpu上為了減少額外的指令對記憶體的消耗,考慮引入thumb指令集到處理器。現在最...
ARM指令與thumb 指令
1 thumb指令集概述 為相容資料匯流排寬度為16位的應用系統,arm體系結構除了支援執行效率很高的32位arm指令集以外,同時支援16位的thumb指令集。thumb指令集是arm指令集的乙個子集,是針對 密度問題而提出的,它具有16位的 寬度。與等價的32位 相比較,thumb指令集在保留32...