32位的處理器,它的每一條指令是4個位元組順序儲存,cpu是順序執行的,只要沒發生什麼跳轉,它會順序進行執行這些指令, 編譯器對**中的變數名、函式名等東西進行乙個位址的編排,賦予這些抽象的東西乙個位址,然後在程式中訪問這些變數名、函式名就是在訪問一些位址,這些位址我們稱之為編譯位址。
是指程式指令真正執行的位址,是由使用者指定的,使用者將執行位址燒錄到**,也就是pc當前執行指令所在的實際位址,就是執行的位址。
比如將乙個u-boot反彙編有如下**:
機器碼ea000013)就是在0位址上(執行位址)的指令,這條指令的鏈結位址就是33f00000。33f00000 <__image_copy_start>:
33f00000: ea000013 b 33f00054
假設uboot上兩條指令的鏈結位址為a=0x33000007和b=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中改...