鏈結位址和儲存位址

2021-07-04 19:44:49 字數 619 閱讀 8375

什麼是儲存位址呢?我們知道,我們編寫的c**,會被編譯成彙編指令,進一步變成機器碼,最後載入到arm的記憶體中。也就是說我們的彙編指令被儲存在記憶體之中,而指令對應的位址,就是他的「儲存位址」。其實「儲存位址」的值,一直由pc這個暫存器所記載著。想改變「儲存位址」的值直接改變pc好了

再說鏈結位址,他是指令應該執行的地方,也就是說,正常情況下指令的儲存位址,和鏈結位址應該是相同的。不然程式會出錯。鏈結位址是在程式一開始鏈結時就已經確定了,目的就是規劃整個程式,比如說這個全域性變數放在哪?那個靜態又擱在哪?事前就確定好,那麼到時程式訪問的時候,就可以按照原先說好的位置去找他,那麼這個「鏈結位址」就是我所說的「原先說好的位置」,而「儲存位址」,就是「實際存在的位置」。

但是存在即使「鏈結位址」和「儲存位址」不一樣,也不會出錯的**——位置無關碼。例如一些相對跳轉指令b,bl(首先他們得不會去訪問一些全域性變數或者是靜態變數)他們只需要在當前位置加上偏移量即可,不需要乙個確切的位址。也就是說他們壓根用不到鏈結位址,那麼自然也就不會出錯了。

2440開發板的**首先是存在於nandflash,上電後nandflash中前4k的**,會被自動拷貝到arm片內記憶體中。pc暫存器初始值為0,從執行開始到跳轉到記憶體中執行的這個過程,處理器執行的都是位置無關碼,鏈結位址與儲存位址並不相同。

鏈結位址和執行位址

位置無關 和位置有關 位置無關 要好一些,適應強,放在 都可以執行 位置有關 就必須。三星推薦的啟動方式 bootloader必須大於16kb並小於96kb,假定bootloader為80kb,啟動過程是這個樣子 先開機上電後bl0執行,bl0會載入外部啟動裝置中的bootloader的前16kb ...

鏈結位址與執行位址

32位的處理器,它的每一條指令是4個位元組順序儲存,cpu是順序執行的,只要沒發生什麼跳轉,它會順序進行執行這些指令,編譯器對 中的變數名 函式名等東西進行乙個位址的編排,賦予這些抽象的東西乙個位址,然後在程式中訪問這些變數名 函式名就是在訪問一些位址,這些位址我們稱之為編譯位址。是指程式指令真正執...

關於鏈結位址

回過頭來看我們的helloworld程式,在makefile中 ttext 0x7c00,鏈結位址為0x7c00,code標號的偏移位址為0x15,則鏈結後其位址為0x7c15,其他函式呼叫此函式時,也就會呼叫位址0x7c15,這時jmpl 0,code語句反彙編後為 假如我們在makefile中改...