0

这是一个简短的 C 文件cu.c

int main(int argc, char **argv) {
  (void)argc; (void)argv;
  return 0;
}

当我使用 OpenWatcom 将其编译为 DOS .com 文件时,结果几乎是 3 KiB:

$ owcc -bcom -mcmodel=t -fno-stack-check -Os -s -march=i86 -W -Wall -Wextra -o cu.com cu.c
$ ls -l cu.com
-rwxr-x--- 1 pts pts 2938 Jun 20 19:26 cu.com

执行相同操作(只是退出)的最小可能的 DOS .com 文件是 1 字节长:它包含一条ret指令(字节 0xc3)。

如何cu.c在没有 OpenWatcom C 库 (libc)(最好小于 100 字节)的情况下将我的文件(可能进行一些修改,我不关心 argc 或 argv)编译为较小的 DOS .com 文件?我将直接从我的程序中调用 DOS API 函数 ( int 0x21),因此我不需要任何 OpenWatcom C 库函数。

请注意,带有 Open Watcom 的 COM 可执行文件不能回答我的问题,因为那里提供的解决方案都包括 OpenWatcom C 库。

4

1 回答 1

0

我能够通过使用format dos com而不是system com在我的自定义 .lnk 文件中解决它。通过这样做,libfile cstart_t.objin system begin cominlink.lnk没有被使用,因此 OpenWatcom C 库中的启动代码没有被引用。

生成的 .com 文件只有 3 个字节 ( xor ax, eax; ret),对此我很满意。为了让它真正运行,我必须准备并添加我的.obj文件,其中包含..start:和设置段。

我仍在寻找不需要自定义 .lnk 文件的解决方案。

于 2020-06-21T06:37:55.900 回答