彙編在鏈結階段,符號位址與位址重定位怎麼理解

2022-03-14 00:20:05 字數 2596 閱讀 4638

1樓:做而論道

說來話長。

也不知道樓主是什麼水平,故此,也不知道該從何講起。

下次提問,不要這麼簡略。

說說題目的背景,比如,你所用的,這是什麼彙編哪 ?

2樓:匿名使用者

譬如有兩個函式function1,function2單元,其都用到公共外部變數val,function1內部定義了靜態變數sta,加入兩個函式都是獨立的編譯單元,分別生成的物件檔案為function1.obj,function2.obj,

在obj檔案中,val作為外部符號,需要在主程式obj或function1.obj,function2.obj等其中之一宣告。

在乙個獨立的obj中也分資料段,**段,這些段都只有偏移位址,

當連線時,不同obj中相同的功能模組彙編組合在一起,即外部變數val位址會被重新定位(相對於新的資料段基位址,而不再是其所在的obj模組的資料段基位址)

val作為識別符號號,其都有相對於段基址的偏移位址,在鏈結階段模組整合時需要重新定位。

就如小明在自己班上成績排名是第一,但當把整個年級的各個班組合起來考慮時,其排名就未必是第一(可以是第一),阿門。。。

3樓:奧貝利科斯

符號位址是編寫程式時使用的位址替代符號,編譯器會把他翻譯成虛擬位址,而虛擬位址通過作業系統對映得到實際位址的操作就叫位址重定位。

這兩個概念都是在作業系統的基礎上建立的。

在實位址匯程式設計序中,位址就是位址,是真實指向ram或者rom裡的乙個儲存空間的位址匯流排資料。

而作業系統為了實現多程式並行,而且還要執行作業系統本身的程式,就必須為程式重新設定位址,不然兩個實位址程式同是讀寫乙個儲存器就會出問題,這時候就需要對程式裝入,為他提供乙個虛擬的位址空間,這個位址空間的位址通過作業系統的對映規則對映到實際儲存器,這個就叫做位址重定位。

而人類編寫程式的時候,如果考慮對映表就太難了,按照工程學的想法,造車前先造輪子,作業系統提供的位址重灌人就像輪子,而程式設計師只需要在能理解的實位址範圍內程式設計就行了,這時候程式設計師寫的就是符號位址。

如何編寫彙編**,實現自定位獲取當前eip

4樓:

mov ebx,0x4aaaaa                        ;設定指向資料指標

mov dword ptr ds:[ebx],0xc324048b       ;寫入資料

call ebx                                ;執行寫入的資料

004aaaaa    8b0424    mov eax,dword ptr ss:[esp]    ;儲存esp(這裡esp=eip)

004aaaad    c3        retn                          ;返回

我的能力有限,不知是不是你需要的答案,祝你學習愉快!

5樓:匿名使用者

可提供一大概思路。

主程式**先call子程式。

子程式主要**:

pop eax

ret返回主程式後,當前eip的值就儲存在暫存器eax中。

c語言編譯怎樣連線lib檔案,請講解連線的原理,

6樓:八百攝氏度的歆

廣義的**編譯過程,實際上應該細分為:預處理,編譯,彙編,鏈結。

預處理過程,負責標頭檔案,巨集替換,條件編譯的選擇,刪除註釋等工作。gcc –e表示進行預處理。

編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc –s表示進行編譯。

彙編,是將彙編**轉換為機器可執行指令的過程。通過使用gcc –c或者as命令完成。

鏈結,負載根據目標檔案及所需的庫檔案產生最終的可執行檔案。鏈結主要解決了模組間的相互引用的問題,分為位址和空間分配,符號解析和重定位幾個步驟。實

際上在編譯階段生成目標檔案時,會暫時擱置那些外部引用,而這些外部引用就是在鏈結時進行確定的。鏈結器在鏈結時,會根據符號名稱去相應模組中尋找對應符

號。待符號確定之後,鏈結器會重寫之前那些未確定的符號的位址,這個過程就是重定位。

彙編中的符號位址是什麼意思?怎麼將數值位址符號化?下面**中畫圈部分是什麼意思?

7樓:匿名使用者

你理解成高階語言的變數即可。

你應該先了解一下匯程式設計序的基本結構。

資料段堆疊段

**段定義在資料段裡的資料,就可以用符號化位址(變數)來訪問如:data segment

a db '12345', 12,34,56b dw 12,34,67,89h

data ends

這裡的a, b就是符號化位址。也相當於高階語言裡的變數的地位。

組合語言符號位址什麼時候表示位址,什麼時候表示數值

8樓:匿名使用者

彙編bai中的定址方式很多

du~ (以下內容出自i《zhibm-pc組合語言程dao序設計》) 與資料有專關的定址方式 1,立屬即定址方式 運算元直接存放在指令中,緊跟在操作碼之後,它作為指令的一部分存放在**段,這種運算元成為立即數。