<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 運行時(shí)域和加載時(shí)域(運行地址和加載地址)

運行時(shí)域和加載時(shí)域(運行地址和加載地址)

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
AT(ldadr):定義本段存儲(加載)的地址。

看一個(gè)簡(jiǎn)單的例子:

本文引用地址:http://dyxdggzs.com/article/201611/322377.htm

SECTIONS{

firtst0x00000000:{head.oinit.o}

second0x30000000:AT(4096){main.o}

}

以上,head.o放在0x00000000地址開(kāi)始處,init.o放在head.o后面,他們的運行地址也是0x00000000,即連接和存儲地址相同(沒(méi)有AT指定);main.o放在4096(0x1000,是AT指定的,存儲地址)開(kāi)始處,但是它的運行地址在0x30000000,運行之前需要從0x1000(加載處)復制到0x30000000(運行處),此過(guò)程也就用到了讀取Nandflash。這就是存儲地址和連接(運行)地址的不同,稱(chēng)為加載時(shí)域和運行時(shí)域,可以在.lds連接腳本文件中分別指定。

編寫(xiě)好的.lds文件,在用arm-linux-ld連接命令時(shí)帶-Tfilename來(lái)調用執行,如arm-linux-ld–Tnand.ldsx.oy.o–oxy.o。也用-Ttext參數直接指定連接地址,如arm-linux-ld–Ttext0x30000000x.oy.o–oxy.o。

總之:

連接地址<==>運行地址
存儲地址<==>加載地址

既然程序有了兩種地址,就涉及到一些跳轉指令的區別,下面就來(lái)具體看看這些跳轉指令。

ARM匯編中,常有兩種跳轉方法:b跳轉指令、ldr指令向PC賦值。

(1)bstep1:b跳轉指令是相對跳轉,依賴(lài)當前PC的值,偏移量是通過(guò)該指令本身的bit[23:0]算出來(lái)的,這使得使用b指令的程序不依賴(lài)于要跳到的代碼的位置,只看指令本身。

(2)ldrpc,=step1:該指令是從內存中的某個(gè)位置(step1)讀出數據并賦給PC,同樣依賴(lài)當前PC的值,但是偏移量是那個(gè)位置(step1)的連接地址(運行時(shí)的地址),所以可以用它實(shí)現從Flash到RAM的程序跳轉。

我們以后會(huì )經(jīng)常用到“存儲地址和連接地址不同”(術(shù)語(yǔ)上稱(chēng)為加載時(shí)域和運行時(shí)域)的特性:大多機器上電時(shí)是從地址0開(kāi)始運行的,但是從地址0運行程序在性能方面總有很多限制,(運行地址和加載地址不同時(shí),只能用相對跳轉)所以一般在開(kāi)始的時(shí)候,使用與位置無(wú)關(guān)的指令將程序本身復制到它的連接地址處,然后使用向pc寄存器賦值的方法跳到連接地址開(kāi)始的內存上去執行剩下的代碼。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>