2012-05-10 66 views
2

我一直在閱讀程序集。根據我對編程語言的理解,似乎編譯器(彙編器......我知道在別處討論的兩者之間存在細微差別),生成目標代碼。一種不友好的機器語言,沒有指令。該目標代碼由處理器解釋,之後鏈接器使其成爲可執行文件。我知道每個處理器必須以正確的組裝方式說出來。 IE瀏覽器。 .386,.486,.586困惑我的是通過MASM運行DOS程序和通過沒有NASM或GAS的Linux運行相同程序的區別。如果源代碼被編譯成目標代碼,那麼它不是跨平臺的?我可以像戴爾一樣輕鬆地從戴爾啓動Windows。我在這裏錯過了什麼?在Linux,Windows上運行程序集

而且我一直在尋找一種方式來查看對象的代碼,這樣我就不必通過破譯免疫調試器的執行。只是我編寫的源代碼的指令機器碼指令。有什麼方法可以在Linux中產生像objdump這樣的結果嗎?

+1

請[不要將簽名或標語添加到您的帖子](http://stackoverflow.com/faq#signatures)。 – meagar

+0

DOS在(16bit)實模式下執行,與32位Windows/Linux中使用的保護模式非常不同。它是如此不同,它可以被認爲是一個不同的架構(如ARM與MIPS),所以它不再是跨平臺的。 Windows使用特殊的硬件兼容模式(虛擬模式)來執行DOS二進制文件,但是在更新的(x86_64)系統上,即使這種模式不再可行 – hirschhornsalz

+2

問題的核心是雖然彙編程序是低級別的,但它仍然必須與OS。由於它的級別有多低,它必須使用最低級別的調用機制與操作系統進行交互,這在OS之間完全不同。而且,程序集通常直接訪問內存來處理自己的進程,這取決於操作系統的完全不同。大家看到DOS和Linux上命令行參數所需的不同彙編源代碼? – Linuxios

回答

9

一個現代的「x86」芯片至少可以理解三種不同的指令集 - 一種是由DOS使用的一種16位指令集,另一種是32位和64位的指令集,由linux的各種風格使用。

即使芯片是相同的,並且可能在相同的模式下運行時,程序與主機操作系統交互以獲得服務(如輸入/輸出)的方式是完全不同的。

所有,但最瑣碎的方案往往利用額外的目標代碼外部庫,其提供援助的常用操作(字符串操作,formattted輸入和輸出,數學,非平凡網絡等),讓他們不要的不得不從頭開始寫。但是,可用的這些庫的精確收集,以及作爲請求和與之交互的手段的重要性取決於主機操作系統。你也許可以用你的應用程序打包這些庫(靜態鏈接),而不是使用.DLL的/ .so期望已經存在於系統上(動態鏈接),但是仍然需要滿足請求底層原始操作系統服務的差異。

此外,一些方案,例如Java和.NET物理處理器上創建運行在虛擬機上的目標代碼,或模擬的處理器,而不是直接。在某種程度上,如果虛擬機引擎和支持庫以兼容的形式提供,則這些功能是可移植的。

objdump的的MinGW的版本在Windows上運行並處理的Windows可執行文件,是一個工具套件,用於構建Windows程序可以與類似Linux的語義的一部分。還有一個在Linux上運行並處理Windows文件的交叉版本。換句話說,WINE兼容性層可以在Windows上運行多個Windows可執行文件 - 您可以明確地對此進行測試。但是如果你願意用C寫入posix接口(或者在使用assembly的OS函數上使用大量的包裝),你應該可以擁有一個代碼庫,可以與linux和cross或mingw版本的gnu工具一起構建,這樣您可以相對高效地爲兩個操作系統生成二進制文件。

+0

哇,謝謝你的信息。這給了我的研究方向。 – Ccorock

相關問題