问题 可执行文件究竟是如何工作的?


我知道可执行文件包含指令,但这些指令究竟是什么?如果我想打电话给 MessageBox 例如API函数,指令是什么样的?

谢谢。


6951
2017-10-24 02:43


起源



答案:


可执行文件 是操作系统可以理解的二进制文件。可执行文件将包含其中包含数据的部分。 Windows使用 PE格式。 PE格式有一个部分  说明。这些指令只是按顺序排序并由CPU理解的数字。

对MessageBox()的函数调用将是一系列指令

1)具有DLL中的函数的地址。该地址由编译器输入

2)将参数“推”到堆栈上的指令

3)实际的函数调用

4)某种清理(取决于调用约定)。

重要的是要记住EXE文件只是特殊格式的文件。我没有为你拆卸,但你可以尝试编译你的代码,然后在visual studio中打开你的EXE来查看反汇编。


10
2017-10-24 02:51



感谢您的回答,但维基百科说DLL文件也使用PE格式。这是为什么? - Alon Gubkin
它究竟是如何“推动”这些参数的呢?我从PE Explorer中知道DLL保存了函数及其参数的大小,例如8个字节可以是int,int。 - Alon Gubkin
DLL还可以包含EXE可以在运行时使用的可执行代码 - 因此名称为“动态链接库”。 - Rob
是的,Windows很灵活。 Windows中的DLL类似于EXE,但没有入口点。基本上,它就像一个无法运行的EXE。 DLL还有其他功能,如函数地址,可以从DLL外部调用。 PE格式是灵活的,并且扩展为甚至包含.NET代码,资源文件等。 - Andrew Keith
在某些情况下,DLL可以通过“运行它”直接执行,但可以通过其他进程/可执行文件执行。 - o.k.w


答案:


可执行文件 是操作系统可以理解的二进制文件。可执行文件将包含其中包含数据的部分。 Windows使用 PE格式。 PE格式有一个部分  说明。这些指令只是按顺序排序并由CPU理解的数字。

对MessageBox()的函数调用将是一系列指令

1)具有DLL中的函数的地址。该地址由编译器输入

2)将参数“推”到堆栈上的指令

3)实际的函数调用

4)某种清理(取决于调用约定)。

重要的是要记住EXE文件只是特殊格式的文件。我没有为你拆卸,但你可以尝试编译你的代码,然后在visual studio中打开你的EXE来查看反汇编。


10
2017-10-24 02:51



感谢您的回答,但维基百科说DLL文件也使用PE格式。这是为什么? - Alon Gubkin
它究竟是如何“推动”这些参数的呢?我从PE Explorer中知道DLL保存了函数及其参数的大小,例如8个字节可以是int,int。 - Alon Gubkin
DLL还可以包含EXE可以在运行时使用的可执行代码 - 因此名称为“动态链接库”。 - Rob
是的,Windows很灵活。 Windows中的DLL类似于EXE,但没有入口点。基本上,它就像一个无法运行的EXE。 DLL还有其他功能,如函数地址,可以从DLL外部调用。 PE格式是灵活的,并且扩展为甚至包含.NET代码,资源文件等。 - Andrew Keith
在某些情况下,DLL可以通过“运行它”直接执行,但可以通过其他进程/可执行文件执行。 - o.k.w


如果我看过一个,这是一个臃肿的问题。 但是,我会尽力概述。 在二进制可执行文件中有一些称为“字节代码”的东西,字节代码只是指令的十六进制代表。通常,您可以“查找”字节代码并将其转换为汇编指令。例如: 说明:

mov ax, 2h

有字节码表示:

B8 02 00

字节代码被加载到RAM中并由处理器执行,因为它是“语言”。没有人理解我用字节代码知道程序,复杂的方式就是狡猾的。装配很有趣......原样。每当您使用更高级别的语言编译程序时,它必须将您的代码转换为汇编指令,您只需想象编译后代码会看起来多么糟糕。不要误会我的意思,编译器很棒,但是用IDA Pro免费软件拆解C ++程序,你会看到我在说什么。 简而言之,这是可执行文件,肯定有关于这个主题的书籍。 我不是Windows API专家,但是其他人可以向您展示调用Windows API“MessageBox”的说明。它应该只是几行大会。


4
2017-10-24 03:12





无论编写什么代码(无论是用C还是其他语言编写)都是由编译器编译成一种特殊的语言,称为汇编(好吧,机器码,但它们非常接近)。汇编是一种非常低级的语言,CPU本机执行。通常,您不会在汇编中编程,因为它是如此低级别(例如,您不希望处理从内存中来回拉取位)。

我不能说了 MessageBox 具体的功能,但我猜它是一个 LOT 说明。想一想:它必须绘制框,然后设置样式,然后计算机将其设置为样式,并连接一个偶数处理程序,以便在用户单击按钮时发生某些事情,告诉Windows(或任何操作系统)将其添加到任务栏(或停靠等),还有很多其他的东西。


2
2017-10-24 02:51





这取决于你正在使用的语言。但对于许多人来说,它就像......

msgbox("Your message goes here")

要么

alert("Your message goes here")

-4
2017-10-24 02:47



我真的不认为你理解我的问题,我的意思是在编译后,这些指令是什么样子的? - Alon Gubkin