ARM MOV PC加8
緣由
今天在分析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