我正在尝试学习x86。我认为这很容易入手 - 我只是编译一个非常小的程序,基本上什么都没有,看看编译器给了我什么。问题是它给我带来了大量的臃肿。 (此程序不能在dos模式下运行等)25KB文件包含一个空的main()调用一个空函数。
如何在没有这些臃肿的情况下编译我的代码? (为什么它首先出现在那里?)
答案 0 :(得分:4)
可执行格式包含的不仅仅是CPU要执行的原始机器代码。如果你想要那么唯一的选择是(我认为)一个DOS .com文件,它本质上只是一堆代码加载到一个页面然后跳进去。一些软件(例如Volkov指挥官)巧妙地使用这种格式来提供非常少的可执行代码。
无论如何,Windows使用的PE格式包含一些特别列出的内容:
您可能不需要其中的一些,但编译器通常不知道您正在尝试创建一个小的可执行文件。通常现在的开销可以忽略不计。
尽管如此,有an article out there努力创建最小的PE文件。
答案 1 :(得分:2)
通过挖掘旧编译器可能会获得更好的结果。如果你想要非常简单的二进制文件COM文件就是那样,那么如果你掌握了一个支持生成COM二进制文件而不是EXE的旧编译器,你应该设置它。在http://www.thefreecountry.com/compilers/cpp.shtml有一长串免费编译器,我认为Borland的Turbo C将是一个很好的起点。
答案 2 :(得分:0)
膨胀模块可以是链接器附加的加载器(操作系统所需的接口)。尝试添加仅包含以下内容的模块:
void foo(){}
并查看反汇编(我假设这是编译器'给你'的格式)。当然,细节因操作系统和编译器而异。有这么多!