日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cortex-M3 动态加载一(地址无关代码实现)

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cortex-M3 动态加载一(地址无关代码实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章是自己疑惑究竟地址無關性是如何實現,然后查看匯編和CPU指令手冊,最后分析解除自己疑惑的,高手不要鄙視,哈哈。

編譯C代碼時候需要制定--acps/ropi選項,如下例子:

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} 匯編指令

?

查看關鍵的一句調用函數fun_for_sub的匯編代碼:

0x00000006: f7fffffe .... BL fun_for_sub ; 0x2 Section #1

?

查找arm的官方DDI0403D_arm_architecture_v7m_reference_manual_errata_markup_1_0.pdf關于BL指令的解釋如下:

Branch with Link (immediate) calls a subroutine at a PC-relative address.

得知BL是一條PC相關的指令。

具體看BL指令的構成:

?

?

根據我們產生的指令f7fffffe,

對應如下:

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

?

符號位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的補碼,另外當前PC是0x00000006,

再根據上面的Operation最后一步BranchWritePC( PC + imm32)

最終跳轉到0x6 + (-4) = 0x2的地址出,即函數fun_for_sub的地址,因此實現根據當前PC實現了地址無關性的代碼。

在X86平臺下面也是差不多的原理,使用的也是基于PC相關的跳轉指令。《程序員的自我修養—鏈接、裝載和庫》講得很好。

轉載于:https://www.cnblogs.com/ppym/p/3655425.html

總結

以上是生活随笔為你收集整理的Cortex-M3 动态加载一(地址无关代码实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。