问题标签 [watcom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
734 浏览

c - C 源代码、Watcom 编译器和 EMU8086

如何让 Watcom 编译器(在 64 位主机上运行的分叉版本 2.0 测试版)在 ASM 文件中输出 8086 汇编源代码?从命令提示符运行wcc -0 main.c只会生成 OBJ 文件。

附带说明一下,我的主要任务是将 C 源代码转换为可以使用 EMU8086 运行的汇编代码(而不是编写实际的汇编代码)。我希望 Watcom 生成的 ASM 文件无需修改(复制粘贴)即可在 EMU8086 中运行。

0 投票
1 回答
214 浏览

c++ - OpenWatcom / VisualStudio 在调用约定中的互操作性

我想用 OpenWatcom 编译一个 Photoshop Filter 插件。该代码已经存在并且与 Visual Studio 完美配合。

该函数如下所示:

它在 Visual C++ 中完美运行。请注意,没有明确指定调用约定(Adobe 没有在其 SDK 头文件中定义任何调用约定)。

虽然它在 VC++ 中有效,但在 OpenWatcom 中这不起作用,而且调用约定似乎不正确。(即使使用“HelloWorld”函数,我也会遇到奇怪的行为,例如损坏的堆栈)。

在 Wikipedia 上,我查看了包含调用约定的表格:该表格显示,如果未指定调用约定,Watcom 会将参数放入寄存器“EAX、EDX、EBX、ECX”中,从右到左填充堆栈,然后被调用者清理堆。但是该表没有说明如果没有指定调用约定,Microsoft 编译器会做什么。我确实认为 Visual Studio 默认使用不同的调用约定。所以我尝试在 OpenWatcom 中指定__stdcall,__cdecl__pascal,但这并没有太大帮助。

我的一个问题是,如果未指定任何内容,Visual Studio 的默认调用约定到底是什么?究竟将什么放入寄存器,在堆栈上的哪个方向,以及谁清理堆栈?我在任何地方都找不到这些信息。

如果我知道确切的行为,我也许可以使用 OpenWatcom 中的“#pragma aux”功能来强制执行自定义调用约定?

或者您知道我可以尝试修复 OpenWatcom 中的调用约定的其他内容吗?

0 投票
1 回答
140 浏览

makefile - 在 Watcom makefile 中扩展宏时 *$ 是什么意思?

我在遗留项目中有一组特殊的 makefile。它们由 Watcom 制作处理,但它们似乎具有 NMAKE 文件格式。我经常遇到以下构造:

$(_cmd_run)只是宏观扩张,但在这种情况下,美元符号前还有一个星号。我似乎找不到任何关于其目的的文档。NMAKE 文档没有关于此语法的任何内容。我什至尝试查找 Open Watcom 源文件,但无济于事。

这个星号代表什么?

0 投票
1 回答
1328 浏览

assembly - Qemu 和原始二进制文件

我正在编译和运行二进制文件(引导扇区,第 1 阶段,第 2 阶段)以进行练习。引导扇区是 asm,第一阶段是运行良好的 asm。第二阶段在 0x1000 加载,我有一些 asm 跳转到我的 C 代码的开头。我的跳跃和呼叫似乎关闭(短)两个字节。

我已经尝试过 Bochs 和 Qemu 中的代码(单步执行)。所有代码看起来都不错。我什至在 IDA 中对它进行了拆卸,每个看起来都不错。我认为这可能是我缺乏代码对齐知识。

第二阶段从 0x1000 开始:

第一次跳转位于 0x1010(这是反汇编的 C 代码):

上面对 0x14CA 的调用实际上落在了 0x000014c9 处,短了两个字节。

在上面的代码中,我希望跳转或调用到达操作数地址,但它总是错过两个字节。

0 投票
1 回答
217 浏览

c - 如何在 Watcom C 中定义 NORETURN 宏

是否可以做一个#define NORETURN(x)与 Open Watcom C 编译器(不是 C++)一起使用的宏?

根据精美的手册,我有这个文件test.c

它使用 GCC 编译没有任何错误或警告:

但不使用 Open Watcom 1.9:

仔细阅读后,我认为手册说__pragma出于某种原因仅适用于 C++ 代码。但我不确定我是否理解正确。是否有任何 C 的等价物不需要在#pragma每个函数定义的位置使用?我试图避免使用 ifdef,因此最好在一个中心位置定义一个可移植的 NORETURN 宏。

0 投票
0 回答
125 浏览

c - 调试器中缺少调试信息

目前我正在使用 Clion IDE 加上最新版本的 Open Watcom v2 windows 32 位编译器来开发一些 16 位 MS-DOS 应用程序。我遇到的问题是使用 watcom windows 调试器 (wdw.exe) 时看不到所有必需的调试信息。具体来说,我看到全局变量、全局和任何其他类型的函数,甚至是从 asm 文件中导入的函数。但是,局部变量列表一直是空的。但更重要的是——我能看到的唯一 c 代码是一个小 test.c 文件,它只包含 main() 函数,除了包含之外什么都没有。我需要做什么才能最终获得整个项目的 c 级调试?我错过了什么?如果有任何帮助,我将不胜感激。

所有源文件都位于一个目录中,因此,它们都应该对调试器可见。但它只看到主 c 文件。当然,我正在使用 -d2 开关以及 -hw 进行编译。DEBUG WATCOM ALL 也出现在任何 FILE 指令之前的链接器配置文件中。阅读编译器和链接器的手册...嗯,很高兴我在手册中发现了许多有趣的东西,但到目前为止,对于这个问题没有任何帮助:)

我目前使用的编译器开关列表:

0 投票
1 回答
366 浏览

c - OpenWatcom编译链接的小模型DOS.exe崩溃

我正在尝试创建一个小型 DOS .exe 程序。我在 NASM 程序集中写了入口点

请注意,我不确定..start:代码和段应该是什么样子,我从某处复制粘贴了该部分。

我用 C 编写了主程序:

我用这个编译它:

生成的 prog.exe 是:

prog.exe的反汇编:

prog.exe使 DOSBox 进入无限循环。奇怪的是,如果我从 C 源文件中删除字符串文字(在other函数中,甚至没有被调用),它会成功返回。汇编文件有什么问题?

请注意,这是我第一次使用 OpenWatcom,也是我第一次构建 DOS .exe 文件。

我不想编写main函数,因为这会导致 OpenWatcom libc 链接到输出可执行文件,使其变得不必要地大。

0 投票
1 回答
46 浏览

exe - 如何使用 OpenWatcom 链接器使 DOS .exe 重定位表更小?

我用 OpenWatcom 创建了以下 DOS .exe 文件:

地区:

  • 0x0...0x1c:DOS .exe 标头。
  • 0x1c...0x20:4 字节的填充。
  • 0x20...0x24:4 个字节,包含 1 个重定位条目。
  • 0x24...0x30:12 字节的填充。
  • 0x30...:带有 16 位 8086 机器码的代码 (_TEXT) 段。
  • ...

如何摆脱 4 字节的填充和 12 字节的填充,使代码从偏移量 0x20 开始?这有 WLINK 标志吗?我应该使用不同的链接器吗?我应该对生成的 .exe 进行后处理吗?

0 投票
1 回答
174 浏览

c - 如何使用 OpenWatcom `owcc` 创建 DOS .com 文件,但没有 OpenWatcom libc?

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

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

执行相同操作(只是退出)的最小可能的 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 库。

0 投票
0 回答
45 浏览

c - 根据 OpenWatcom C 语言中的参数类型检测调用哪个函数

根据参数中的指针大小,我有 2 个相同函数的实现:

我想自动选择调用哪个,所以我写了一个宏:

但是,如果使用远指针调用它,wcc 会为未调用的分支发出警告:

我也尝试过C11 _Generic,但 wcc 似乎不支持它:

我收到此警告,然后出现错误:

如何在 C(不是 C++)中,在 Open Watcom V2 中使用 wcc,在小内存模型(-ms)中使其在没有警告的情况下工作?