2012-03-21 190 views
4

我不清楚如何在彙編程序和鏈接器中處理彙編程序中的部分(使用部分指令聲明)。以下是是一些疑問:彙編語言程序中的部分

  • 用的是什麼用戶定義段(段比標準的.text,.data和.bss除外)?

  • 如果我把代碼放在數據段和代碼段中的數據怎麼辦?彙編程序如何處理它?

  • 如果程序中沒有聲明任何部分,彙編程序會做什麼?

  • 如果只聲明瞭用戶定義的部分(沒有文本,數據和bss),彙編程序將執行什麼操作?

我知道我可以寫彙編程序來測試程序將在每種情況下工作,但我想這個概念清晰。

回答

2

部分不過是獨立的存儲器序列。每個新的數據字節都放入當前打開的「程序段」中。編寫一個函數使源代碼中的關聯數據非常接近,即使將其加載到內存中時,它可能是兆字節或千兆字節,這是相當方便的。

用戶定義的程序段與標準段的工作方式相同,但通常必須向鏈接器和其他代碼後處理工具提供附加信息,以便以合理的方式將它們加載到內存中。

您可以將可執行代碼放置在數據段中,反之亦然,大多數彙編器甚至不會提醒它。從數據部分執行代碼可能需要一點小技巧;反過來通常很容易。

彙編程序通常通過按照源代碼的相同順序將等價物寫入對象模塊來處理段,而將相似段的重新排列一起留給鏈接器。只有最簡單的彙編器不提供這種能力。想到原始的MSDOS .COM文件彙編器。

不同的彙編程序對程序員有不同的理解。傳統的策略是假定彙編語言程序員知道他們在做什麼,並且從字面上理解除了沒有被理解的東西外什麼都寫了。其他彙編程序更有幫助(或屁股痛苦,取決於您的觀點),並抱怨未對齊的多字節結構,數據或代碼類型不匹配等。

基於「有用性「的彙編程序,未能啓動程序部分會導致默認行爲(通常是假定的代碼.psect),或拒絕彙編致命錯誤。即使是最結構化的彙編器也不在乎是否沒有文本,數據或bss。事實上,有些有用的對象模塊只包含符號定義,根本沒有數據(或代碼)字節。

+0

裝配人員不要重新安排部分? – vjain27 2012-03-21 17:29:08

+0

您能否告訴我們鏈接器在這些情況下的行爲? – vjain27 2012-03-21 17:33:28

+0

感謝您的解釋!還有一件事情還在我腦海裏,那就是如果沒有文本或數據部分的聲明,並且彙編器不關心鏈接器會做什麼?可執行文件中不需要文本和數據部分? – vjain27 2012-03-21 17:40:57