问题标签 [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.
c - C 源代码、Watcom 编译器和 EMU8086
如何让 Watcom 编译器(在 64 位主机上运行的分叉版本 2.0 测试版)在 ASM 文件中输出 8086 汇编源代码?从命令提示符运行wcc -0 main.c只会生成 OBJ 文件。
附带说明一下,我的主要任务是将 C 源代码转换为可以使用 EMU8086 运行的汇编代码(而不是编写实际的汇编代码)。我希望 Watcom 生成的 ASM 文件无需修改(复制粘贴)即可在 EMU8086 中运行。
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 中的调用约定的其他内容吗?
makefile - 在 Watcom makefile 中扩展宏时 *$ 是什么意思?
我在遗留项目中有一组特殊的 makefile。它们由 Watcom 制作处理,但它们似乎具有 NMAKE 文件格式。我经常遇到以下构造:
$(_cmd_run)
只是宏观扩张,但在这种情况下,美元符号前还有一个星号。我似乎找不到任何关于其目的的文档。NMAKE 文档没有关于此语法的任何内容。我什至尝试查找 Open Watcom 源文件,但无济于事。
这个星号代表什么?
assembly - Qemu 和原始二进制文件
我正在编译和运行二进制文件(引导扇区,第 1 阶段,第 2 阶段)以进行练习。引导扇区是 asm,第一阶段是运行良好的 asm。第二阶段在 0x1000 加载,我有一些 asm 跳转到我的 C 代码的开头。我的跳跃和呼叫似乎关闭(短)两个字节。
我已经尝试过 Bochs 和 Qemu 中的代码(单步执行)。所有代码看起来都不错。我什至在 IDA 中对它进行了拆卸,每个看起来都不错。我认为这可能是我缺乏代码对齐知识。
第二阶段从 0x1000 开始:
第一次跳转位于 0x1010(这是反汇编的 C 代码):
上面对 0x14CA 的调用实际上落在了 0x000014c9 处,短了两个字节。
在上面的代码中,我希望跳转或调用到达操作数地址,但它总是错过两个字节。
c - 如何在 Watcom C 中定义 NORETURN 宏
是否可以做一个#define NORETURN(x)
与 Open Watcom C 编译器(不是 C++)一起使用的宏?
根据精美的手册,我有这个文件test.c
:
它使用 GCC 编译没有任何错误或警告:
但不使用 Open Watcom 1.9:
仔细阅读后,我认为手册说__pragma
出于某种原因仅适用于 C++ 代码。但我不确定我是否理解正确。是否有任何 C 的等价物不需要在#pragma
每个函数定义的位置使用?我试图避免使用 ifdef,因此最好在一个中心位置定义一个可移植的 NORETURN 宏。
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 指令之前的链接器配置文件中。阅读编译器和链接器的手册...嗯,很高兴我在手册中发现了许多有趣的东西,但到目前为止,对于这个问题没有任何帮助:)
我目前使用的编译器开关列表:
c - OpenWatcom编译链接的小模型DOS.exe崩溃
我正在尝试创建一个小型 DOS .exe 程序。我在 NASM 程序集中写了入口点
请注意,我不确定..start:
代码和段应该是什么样子,我从某处复制粘贴了该部分。
我用 C 编写了主程序:
我用这个编译它:
生成的 prog.exe 是:
prog.exe的反汇编:
prog.exe
使 DOSBox 进入无限循环。奇怪的是,如果我从 C 源文件中删除字符串文字(在other
函数中,甚至没有被调用),它会成功返回。汇编文件有什么问题?
请注意,这是我第一次使用 OpenWatcom,也是我第一次构建 DOS .exe 文件。
我不想编写main
函数,因为这会导致 OpenWatcom libc 链接到输出可执行文件,使其变得不必要地大。
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 进行后处理吗?
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 库。
c - 根据 OpenWatcom C 语言中的参数类型检测调用哪个函数
根据参数中的指针大小,我有 2 个相同函数的实现:
我想自动选择调用哪个,所以我写了一个宏:
但是,如果使用远指针调用它,wcc 会为未调用的分支发出警告:
我也尝试过C11 _Generic,但 wcc 似乎不支持它:
我收到此警告,然后出现错误:
如何在 C(不是 C++)中,在 Open Watcom V2 中使用 wcc,在小内存模型(-ms
)中使其在没有警告的情况下工作?