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,立屬即定址方式 運算元直接存放在指令中,緊跟在操作碼之後,它作為指令的一部分存放在**段,這種運算元成為立即數。