Cortex-M3 动态加载一(地址无关代码实现)
這篇文章是自己疑惑究竟地址無(wú)關(guān)性是如何實(shí)現(xiàn),然后查看匯編和CPU指令手冊(cè),最后分析解除自己疑惑的,高手不要鄙視,哈哈。
編譯C代碼時(shí)候需要制定--acps/ropi選項(xiàng),如下例子:
1 void SystemInit(void) 2 { 3 } 4 void fun_for_sub(void) 5 { 6 int j; 7 for(j=65535;j >=0; j--) 8 ; 9 } 10 int main(void) 11 { 12 fun_for_sub(); 13 while(1); 14 } C-example?
編譯:
armcc -c --cpu Cortex-M3 -O0 --apcs=interwork --apcs /ropi/rwpi -o main.o main.c?
使用fromelf查看匯編代碼
fromelf.exe -s -c main.o?
text段生成的匯編代碼如下:
1 ** Section #1 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR] 2 Size : 14 bytes (alignment 2) 3 Address: 0x00000000 4 5 $t 6 .text 7 SystemInit 8 0x00000000: 4770 pG BX lr 9 fun_for_sub 10 0x00000002: 4770 pG BX lr 11 main 12 0x00000004: b500 .. PUSH {lr} 13 0x00000006: f7fffffe .... BL fun_for_sub ; 0x2 Section #1 14 0x0000000a: 205a Z MOVS r0,#0x5a 15 0x0000000c: bd00 .. POP {pc} 匯編指令?
查看關(guān)鍵的一句調(diào)用函數(shù)fun_for_sub的匯編代碼:
0x00000006: f7fffffe .... BL fun_for_sub ; 0x2 Section #1?
查找arm的官方DDI0403D_arm_architecture_v7m_reference_manual_errata_markup_1_0.pdf關(guān)于BL指令的解釋如下:
Branch with Link (immediate) calls a subroutine at a PC-relative address.得知BL是一條PC相關(guān)的指令。
具體看BL指令的構(gòu)成:
?
?
根據(jù)我們產(chǎn)生的指令f7fffffe,
對(duì)應(yīng)如下:
f7ff : 15 14 13 12 11 10 9 8 7 6 5 4 3 2 11 1 1 1 0 1 1 1 1 1 1 1 1 1 1 fffe : 15 14 13 12 11 10 9 8 7 6 5 4 3 2 11 1 1 1 1 1 1 1 1 1 1 1 1 1 0?
符號(hào)位S=1,J1=1,J2=1,imm10 = 11 1111 1111,imm11 = 111 1111 1110?
所以I1 = !(J1~S) = 1,? I2 = !(J2~S) = 1,
imm32 = SignExtend(S:I1:I2:imm10:imm11:’0’,32) = SignExtend(1:1:1:11 1111 1111:111 1111 1110:’0’,32) = 1111 1111 1111 1111 1111 1111 1111 1100 = 0xfffffffc。
0xfffffffc是-4的補(bǔ)碼,另外當(dāng)前PC是0x00000006,
再根據(jù)上面的Operation最后一步BranchWritePC( PC + imm32)
最終跳轉(zhuǎn)到0x6 + (-4) = 0x2的地址出,即函數(shù)fun_for_sub的地址,因此實(shí)現(xiàn)根據(jù)當(dāng)前PC實(shí)現(xiàn)了地址無(wú)關(guān)性的代碼。
在X86平臺(tái)下面也是差不多的原理,使用的也是基于PC相關(guān)的跳轉(zhuǎn)指令。《程序員的自我修養(yǎng)—鏈接、裝載和庫(kù)》講得很好。
轉(zhuǎn)載于:https://www.cnblogs.com/ppym/p/3655425.html
總結(jié)
以上是生活随笔為你收集整理的Cortex-M3 动态加载一(地址无关代码实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ULS 日志为空
- 下一篇: cannot import name '