【问题标题】:Compiled COM files with empty project is over 10 KiB large in Turbo Pascal使用空项目编译的 COM 文件在 Turbo Pascal 中超过 10 KiB
【发布时间】:2023-02-16 18:52:47
【问题描述】:

我对旧 Pascal 版本的二进制大小有疑问。

我们需要非常小的简单程序。我们想在MS-DOS下使用Turbo Pascal 2(更高也是同样的问题)来编译COM文件。但大小始终为 10 KiB 或更大,即使对于像这样的空项目也是如此:

begin
end.

编译后的文件大小为 10052 字节。我不懂为什么。我测试了编译器命令,更改了堆栈/堆但没有结果。

编译输出:

Compiling --> c:emtpy.com
  3 lines

code: 0002 paragraphs (32 bytes), 0D7B paragraphs free
data: 0000 paragraphs (0 bytes), 0FE7 paragraphs free
stack/heap: 0400 paragraphs (16384 bytes) (minimum)
            4000 paragraphs (262144 bytes) (maximum)

是否有可能得到一个较小的 COM 文件,是否有可能将 Pascal 代码自动转换为 ASM 代码?

【问题讨论】:

  • 您可以尝试其他编译器,例如现在的 FPC。 Turbo Pascal 很可能正在添加语言例程,不受使用/调用与否的限制。 10052 低于 10 Ki,因为 10052 / 1024 = 9.82 Ki。
  • 刚刚对 TP7 进行了同样的尝试。该程序的大小为 1.59 kB。
  • 是的,没错,但我需要隐藏的是 EXE。不是原创。或者你在 TP7 中创建一个 COM?怎么运行的?
  • 尝试将 exe 文件重命名为 com.取决于可能工作的 DOS 版本。
  • 查看编译器源代码。你会发现很多 asm 文件。由于可以重新编译 RTL,因此可以省略一些 RTL 函数以减小程序占用空间。

标签: compiler-optimization dos pascal turbo-pascal


【解决方案1】:

任何版本的 Turbo Pascal 3.02 之前都会产生一个可执行文件,其中包括所有的运行时库。如您所见,在您的目标操作系统上,TP2 的大小约为 10,050 字节。

我们需要非常小的简单程序。

...那么 Turbo Pascal 2 不是启动的好选择。如果您想坚持使用 Pascal 并以 MS-DOS 为目标,最好尝试使用 4 以上的任何版本。或者切换到 C 或汇编语言,这将能够生成更小的可执行文件,但代价是更难开发。

[...] 是否可以将 Pascal 代码自动转换为 ASM 代码。

它可以使用 Turbo Pascal 完成,但它不实用(基本上你需要一个反汇编器;IDA 就是这样一个工具,现在使用;你需要的版本不是免费的。)而且你不会通过粉碎一些字节获得太多从一个已经编译的应用程序:你会更好地直接用汇编语言开始它。

无论如何,实现它的最佳方法是放弃 Turbo Pascal 并转到 Free Pascal,编译器生成 .s 文件,这些文件是用汇编语言编写的(尽管可能与您使用的语法不同。)那里是(曾经是?)sub-project 以 16 位 i8086 处理器为目标,这似乎是最新的(我从未尝试过。)

更新

您在评论中提到您确实需要 .COM 格式(Turbo Pascal 4-7 不直接支持)。那么问题就出在内存模型上。 .COM 程序本身使用所谓的微小的模型(16 位代码和数据段在同一位置重叠),但对于可以获取所有可用内存的应用程序(不是 TSR)来说,它可能会有所回避; MS-DOS 的 TP 1-3 使用了袖珍的模型(数据指针是 32 位“远”,但代码指针是 16 位“近”,上限为 64 Ki 字节的代码); TP 4-7 正在使用大的每个单元都有一个单独的代码段的模型。可以重写运行时库以仅使用一个代码段,然后重新链接 TP 生成的可执行文件以将 FAR CALL 转换为 NEAR CALL(这很容易,因为所有信息都在 . EXE文件)。但是,直接使用 Free Pascal 会很快回家,它本身支持微型内存模型,并且可以生成 .COM 可执行文件;同时仍然与 Turbo Pascal 高度兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多