鏈結位址與執行位址

2021-09-08 19:23:42 字數 828 閱讀 6811

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

是指程式指令真正執行的位址,是由使用者指定的,使用者將執行位址燒錄到**,也就是pc當前執行指令所在的實際位址,就是執行的位址。

比如將乙個u-boot反彙編有如下**:

33f00000 <__image_copy_start>:

33f00000: ea000013 b 33f00054

機器碼ea000013就是在0位址上(執行位址)的指令,這條指令的鏈結位址就是33f00000。

假設uboot上兩條指令的鏈結位址為a=0x33000007b=0x33000001,映像檔案鏈結起始位址為0x33000000,現在要計算出他們對應的執行位址,假設執行位址的首位址是0x0,則a的執行位址為0x7,b為0x1

如果**不是位置無關碼,

鏈結位址和執行位址

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

鏈結位址和儲存位址

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

關於鏈結位址

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