我知道 DLL 包含一个或多个单独编译、链接和存储的导出函数。
我的问题不是关于如何创建它.. 而是关于它以什么形式存储.. 它是 0 和 1 的形式.. 还是汇编命令 ADD、MUL、DIV、MOV , CALL, RETURN 等。还有什么使它依赖于处理器..(如 x86、x87、IBM 700 指令集)..
有人可以简要解释一下..!
我知道 DLL 包含一个或多个单独编译、链接和存储的导出函数。
我的问题不是关于如何创建它.. 而是关于它以什么形式存储.. 它是 0 和 1 的形式.. 还是汇编命令 ADD、MUL、DIV、MOV , CALL, RETURN 等。还有什么使它依赖于处理器..(如 x86、x87、IBM 700 指令集)..
有人可以简要解释一下..!
首先,计算机中的一切都是“0's & 1's”的形式。计算机可以将其中的一些显示为文本、图片、声音、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 文件一样快。
这能把事情弄清楚吗?:)
在 Windows 中,dll 以PE格式存储,该格式基本上是保存有关如何将其映射到内存中的信息的部分的集合。一些部分包含程序的代码(当然取决于处理器),其他部分包含程序的数据,其他导出和导入的函数等等。
托管代码被编译成一些中间语言,在执行时由运行时 JITed。因此,您的 dll 将不包含任何依赖于处理器的代码,您将能够在具有相关运行时的任何平台上执行您的程序。
本机 DLL(不是 .NET 程序集)通常包含只能在特定平台上运行的机器代码。机器代码是处理器将其视为指令(ADD、MOV 等)的字节序列。
这取决于您的 DLL。通常,DLL 包含作为 EXE 文件的可执行代码。这些代码 DLL 依赖于处理器,因为代码只能在特定平台上执行。该代码使用与 EXE 文件(二进制机器代码)相同的“格式”存储。
但是,DLL 有时只能包含数据:它们被称为“资源 DLL”,根本不依赖于处理器。它们充当应用程序使用的数据文件的容器。
请注意,许多 DLL 是混合的:它们包含代码和资源。例如,构成 Windows 操作系统用户部分的大多数 DLL 都是混合的:您可以使用 Visual Studio 或资源资源管理器打开它们以查看它们包含的资源(数据段),或者使用 Dependency Walker 或 dumpbin 打开它们以查看它们包含的函数(代码段)。
(当然这个答案确实是 Windows 特定的,我不知道 .so 文件是 DLL 的 linux 等价物)
DLL 和 EXE 都包含可执行代码。
在 DLL 的情况下,它没有直接可执行的必要部分。它必须从另一段可执行代码中调用。一个 DLL 可以调用另一个,但最终都必须从 EXE 调用。
因此,适用于 EXE 的有关与何种处理器兼容的规则也适用于 DLL。