在 Turbo Pascal 中编译的带有空项目的 COM 文件超过 10 KiB

问题描述 投票:0回答:2

我对旧 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代码?

compiler-optimization dos pascal turbo-pascal
2个回答
1
投票

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

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

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

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

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

无论如何,实现它的最佳方法是放弃 Turbo Pascal 并转到 Free Pascal,该编译器生成

.s
文件,这些文件是用汇编语言编写的(尽管可能与您使用的语法不同。 ) 有(曾经?)一个针对 16 位 i8086 处理器的子项目,它似乎是最新的(我从未尝试过。)

更新

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


0
投票

取决于您的编译器版本和开关。 10kb 是不可能的。我编写自己的 Turbo Pascal 编译器克隆版,因为我仍在为公司做很多 DOS 遗留项目。

Program Empty;

Begin
End.

我的源代码基本相同,除了我的编译器第 1 行是必需的,所以我知道输出类型。

TPC v7.0.1b: {mine}
03/19/2023  10:33 PM             1,504 EMPTY.EXE
03/19/2023  10:33 PM                29 empty.pas
4 lines, 0.00 seconds, 1360 bytes code, 668 bytes data.

TPC v7.0: {Borland}
03/19/2023  10:36 PM             1,632 EMPTY.EXE
03/19/2023  10:33 PM                29 empty.pas
4 lines, 1472 bytes code, 668 bytes data.

BPC v7.0 {Borland}
03/19/2023  10:37 PM             1,632 EMPTY.EXE
03/19/2023  10:33 PM                29 empty.pas
4 lines, 1472 bytes code, 668 bytes data.

我的编译器和 Borland 的唯一区别是我做了更好的优化(自 TP 存在以来 30 多年学到的技术)。据我所知,自从 v3.0 存在以来,您无法使用 Turbo Pascal 生成 .COM。

© www.soinside.com 2019 - 2024. All rights reserved.