2009-11-18 59 views
0

我知道DLL包含一個或編譯,鏈接,並單獨存放更多的導出函數..什麼樣的形式是DLL&什麼使得它依賴於處理器

我的問題是關於不是如何創建它..但它是以什麼形式存儲的。它是以0's & 1的形式出現,還是在彙編命令ADD,MUL,DIV,MOV,CALL,RETURN等中。 又是什麼使它成爲(如x86,x87,IBM 700指令集)..

有人可以請簡單解釋一下..!

回答

4

首先,在計算機中的所有東西都是「0's & 1」的形式。計算機可以將這些內容中的一些顯示爲文本,圖片,聲音,3D模型等僅僅是您解釋它們的問題。但在那裏,在金屬,它只是「0的& 1」(也稱爲位)。請注意,它們總是以8個一組的形式組合在一起,這些被稱爲「字節」。這確實是爲了提高效率,因爲單獨使用每一點都會太乏味。事實上,今天的電腦甚至不再使用單個字節(或者說 - 他們很少這樣做)。大多數情況下,您一次只能運行4或8個字節,具體取決於您是否擁有32位或64位CPU(從外行的角度來講,實際上它比這更復雜一點)。

至於.DLL文件 - 就像.EXE文件一樣,它包含描述CPU可以執行的指令的字節。 CPU直接從.DLL/.EXE中獲取這些字節,並在沒有進一步修改的情況下執行它們。這就是爲什麼這些文件是CPU特定的。在不同的CPU體系結構中,相同的字節組合意味着不同的東西,所以.DLL/.EXE只能在其設計的CPU上正確運行。在其他CPU上,這些字節將表示一些其他指令,並且在運行時,該程序很可能會做出一些毫無意義的廢話並立即崩潰。

你提到的程序集命令也值得解釋。 「彙編器」不是CPU可以理解的語言。這是一種人類可以理解的語言。它的創建是因爲直接寫入機器代碼(CPU實際理解的字節)非常困難。你得到的是在屏幕上的完全亂碼(嘗試在記事本中打開一些.EXE文件!),但每一點都必須精確設置它的工作。

所以彙編語言基本上是一樣的東西,除了這些指令是用人們可以閱讀的文本編寫的。對於CPU可以理解的每一臺機器代碼,都有一個帶有人性化名稱的指令。彙編編譯器只是讀取這些指令,並用代表CPU執行的實際指令的字節替換它們。這是一個1:1的操作。彙編語言中的每個命令都與單個機器指令相匹配(再次,通俗地說,)。

所以你看,甚至沒有一個彙編語言。每個CPU架構都有自己的彙編語言,因爲它們每個都有不同的指令。

請注意,所有這些都適用於本機.DLL/.EXE文件。 .NET文件是不同的 - 它們不包含機器代碼,而是一個抽象的,不存在的CPU的指令。這就像Java的字節碼。運行.NET .DLL/.EXE時,.NET運行時將其從抽象指令轉換爲特定CPU可以理解的指令。他們使用了很多技巧來使這個速度非常快,所以這些文件幾乎和簡單的.DLL/.EXE文件一樣快。

這是否清楚了事情? :)

+0

當然它確實...很好的解釋總體..謝謝;) – AKN 2009-11-19 06:18:27

2

本地DLL(不是.NET程序集)通常包含只能在特定平臺上運行的機器代碼。機器碼是處理器視爲指令的字節序列(ADD,MOV等)。

+1

而.NET程序集只是「中間語言」的一個例子。其他的例子是Java字節碼和各種P碼格式。 – 2012-02-27 18:40:48

0

DLL和EXE都包含可執行代碼。

在DLL的情況下,它沒有必要的部分可以直接執行。它必須從另一個可執行代碼中調用。一個DLL可以調用另一個DLL,但所有DLL必須最終從EXE調用。

因此有關什麼與適用於EXE的處理器兼容的規則也適用於DLL。

1

它取決於你的DLL。通常,DLL包含可執行代碼作爲EXE文件。這些代碼DLL依賴於處理器,因爲代碼只能在特定平臺上執行。該代碼使用與EXE文件(二進制機器代碼)相同的「格式」進行存儲。然而,一個DLL有時只包含數據:它們被稱爲「資源DLL」,根本不依賴於處理器。它們充當應用程序使用的數據文件的容器。

請注意,許多DLL是混合型的:它們包含代碼和資源。例如,構成Windows操作系統的用戶部分的大多數DLL都是混合的:您可以使用Visual Studio或資源瀏覽器打開它們以查看它們包含的資源(數據段),或使用Dependency Walker或dumpbin打開它們以看到它們包含的函數(代碼段)。

(當然這個答案真的是Windows特定的,我不知道.so文件這是Linux的相當於DLL的)

2

在Windows中,DLL的存儲在PE格式基本上是一個包含有關如何將其映射到內存中的信息的部分的集合。某些部分包含程序代碼(當然這取決於處理器),其他部分包含程序數據,其他部分包括導出和導入的函數等。

託管代碼被編譯爲一些中間語言,該語言在執行時由運行時間進行JIT處理。因此,您的dll不會包含任何與處理器相關的代碼,您可以在任何平臺上使用相關運行時執行您的程序。