1. 程式人生 > >ARM MOV PC加8

ARM MOV PC加8

rect tails mov link instr offset img 而不是 偏移

緣由

今天在分析ARM偽指令ADR,書上說ADR通常會被一條ADD或SUB指令替代實現相同功能。我反匯編了一下確實如此會基於PC相對偏移的地址量讀取到寄存器中,可是計算卻發現對不上
技術分享圖片
如上圖所示,ADR R2,BOB被指令SUB R2,PC,#0x0C替換。

計算

可是由圖可知PC值應該為8,執行完這條語句後指向下一條指令的地址12。可是8-12=-4,得不到結果4。如果要得到4的結果,則PC值應該為16,比理論值大8.

為什麽讀取PC值時,比預想的大8

查閱手冊http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Cihcdbca.html

相關資料https://stackoverflow.com/questions/24091566/why-does-the-arm-pc-register-point-to-the-instruction-after-the-next-one-to-be-e

技術分享圖片

ARM(ARM7) 采用三級流水線結構,取指、譯碼、執行,PC始終指向你要取的指令的地址,而不是執行完一條指令後指向下一條指令的地址
技術分享圖片
當第一條指令進入執行階段的時候,第三條指令進入取指階段,所以PC+8.
在執行第一條指令時,我本以為PC的值為0,在執行完第一條指令後PC+4=4指向第二條指令的地址,可是讓我意向不到是第一條指令在執行階段,第三條指令在取指階段,PC執向取指令的指令地址,所以PC為8。

ARM9采用五級流水結構,但PC也是加8,為什麽?

ARM9雖然是五級流水線,但是它的第一條指令的執行階段也是對應著第三條指令的取指階段,所以為PC+8,更多請看參考

為什麽我的調試器上顯示的PC值沒有加8

請看下圖的運行,PC顯示的值為下一條要執行的指令的地址,並沒有加8為什麽?
技術分享圖片
It‘s easier to have the assembler/linker compensate for that 2-instruction offset than to design all the logic to ‘correct‘ the PC register.也就是說匯編器把R15(PC)這個顯示值進行了補償,使“PC指向下一條要執行的指令的地址”這個邏輯看起來合理。

對此你有何感言?

disgusting ! nasty!

ARM MOV PC加8