问题标签 [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 - watcom 内联汇编出现错误“非法使用寄存器”
我使用的是 Open Watcom IDE V1.9,目标环境是 DOS-16bit,图像类型是 exe。目标cpu是80386。
这是我的源代码:
当我成功时,我得到了这个:
好吧,但我看不出 Line28 是怎么错的,我检查了 open watcom 用户指南,但是在“内联汇编语言”部分,没有关于为什么我得到这个错误的信息。有什么建议吗?
cross-compiling - 在 Linux 下使用 OpenWatcom 为 DOS 交叉编译 freetype
比我为一台旧的 MS-DOS 机器编写程序更有趣。我使用 Linux (Fedora 19) 作为我的开发机器和 OpenWatcom 1.9 来编译我的代码。
现在,我想在我的项目中使用 FreeType (2.5.2),但我无法让它使用 OpenWatcom。像文档建议的那样运行make setup watcom
不起作用,它仍然会自动检测到 unix 系统:
使用./configure --host=i286-pc-msdos
也不会改变任何事情。问题似乎是 FreeFype 构建系统只与 GCC 进行交叉编译。我真的必须在 DosBox 中设置一个完整的构建环境,还是可以说服 FreeType 使用 OpenWatcom 而不是 GCC?
不幸的是,在互联网上找不到太多东西。看起来几乎没有人再使用 DOS 了……
c - 使用 OpenWatcom 在 C 中编译和链接到二进制简单实模式 OS
我有一个用汇编语言编写的简单(非常简单)实模式内核,我正在尝试尽可能多地移植到 C。为此,我将 OpenWatcom 编译器用于 16 位二进制代码。
在我的文件“os.c”中,如果我写下这一行,它就可以工作:
char msg[50];
但如果我这样做:
char msg[50] = "hello";
它只是不起作用。每次我写一个字符串它都会被破坏。我到处搜索,尝试了很多废话,但一无所获。
有谁知道它可能是什么?
我不能发布超过 2 个链接,所以需要的所有 4 个链接都在 pastebin 中。提前致谢。
示例: http: //pastebin.com/xz96N91A
c - 创建具有内存地址的数组时出错
我的矩阵声明实现如下:
这些都是全局变量。这段代码编译得很好。
基本上,“指针”保存变量的地址和它应该保存的最大值。
我的问题是我必须在这个矩阵中添加一个新变量,定义为 uint64_t。尽管我平台中指针的大小是 32 位,但由于变量的大小,我必须将“指针”更改为 uint64_t。但是当我这样做时:
我收到以下错误:
当我简单地更改“指针”类型时,为什么会发生此错误?
我正在使用watcom 1.3作为编译器。Gcc和Visual Studio已经很好地编译了这段代码。
c - 为什么 OpenWatcom 发出:警告!W124:比较结果始终为 0
通过 OpenWatcom,我们(一位同事和我自己)收到以下警告:
我们拥有的代码当然是一个更大项目的一部分,但是导致警告的代码段相当于:
我认为应该将字面值提升为 的整数类型x
,但显然不是。
是什么赋予了?整数提升规则是否不适用于 64 位整数?
唯一的解决方案是显式转换 ( (x > (uint64_t)0xFFFFFFFFU)
) 还是类似的比较0xFFFFFFFFULL
?类型转换实际上会使警告消失,但我没有查看生成的代码来验证它是否仍然有意义。
笔记:
- 代码不编译为 C99,它使用 C89 和 C99 之间的东西(例如,包括 C++ 风格的单行注释)。
- Watcom 和 OpenWatcom 只是我们的一些团队成员使用的编译器,而 OpenWatcom 是唯一在那里抱怨的编译器。
c - 如何使用 WatCom 生成声明段偏移的 RAW BIN
我在 NASM 中编写了一个引导加载程序,它将 64kb 的程序数据从磁盘加载到从地址 0060:0000 [SEG:OFF] 开始的内存中。我通过在汇编中编写一些代码(NASM)测试了我项目的这一部分并将其放入磁盘中。工作正常!
完整的项目完全用汇编编写有点复杂。所以我决定进一步使用 C 和内联汇编。为此,我下载了一个名为open-watcom-c-win32-1.9 的环境。 我有一个简单的 C 代码,用于测试一些 WatCom 编译器和链接器指令以制作 RAW BIN 文件。bin 文件在我的引导加载程序加载到内存后生成但不运行。我尝试了很多 wlink 指令来设置段和偏移值但不起作用。
我认为问题在于编译器和链接器在生成代码时使用了错误的段和偏移地址。因为Wlink在任何情况下都会出现以下错误。
警告!W1023 找不到起始地址,使用 0000:0000
我不知道如何正确设置段偏移地址,但这对于工作程序来说是必要的。我的问题是,我使用什么样的 WatCom 指令从 C 源代码生成 16 位实模式 RAW BIN 文件并声明段:偏移量?WatCom 有可能还是我需要使用其他东西?
c - 如何组装 GAS 程序集并将其与 Open Watcom C 库链接?
我正在尝试生成 16 位 DOS 可执行文件,但使用 gcc 编译器。所以我使用的是古老的 gcc-4.3 ia16 端口。我为我的构建制作了一个 Docker 映像:https ://registry.hub.docker.com/u/ysangkok/ia16-gcc-rask
这是我正在尝试的:
我不包含标头,因为 gcc 不能使用 OpenWatcom 的 libc 标头。
我没有链接,因为我没有可用的 16 位 binutils。如果我构建一个目标文件,它没有正确标记为 16 位。
现在我有这个程序集文件:
在容器之外,在主机中,我尝试用 yasm 组装它:
yasm看不懂,我把语法行注释掉,再试一次,这次成功了。
我测试重定位符号:
可悲的是,它们是 32 位的。当我尝试在容器中进行链接时,它不起作用:
如果我尝试制作 COFF 而不是 ELF,yasm 甚至无法组装:
我知道 yasm 不支持 16 位,但也许有解决方法?有兼容 GAS 的 16 位汇编器吗?GAS-to-Intel 转换器不工作。
c - 打开 Watcom Inline 组装 SEG 和 OFFSET 运算符
今天,我了解到 MASM 中的 SEG 运算符默认返回 GROUP 的地址,而不是相关表达式的 SEGMENT 的地址,并且有一些选项和方法可以覆盖它。
由于我目前在 Open Watcom 1.9 / 16 位 DOS 中做一个复杂的项目,其中混合了 C 和汇编(内联和独立)(实际上,只需要 DOS 来启动,然后我自己的 MINI-OS 控制),因为我知道 WASM 在某种程度上兼容 MASM,我有以下问题:
在进行内联汇编并取变量的段时,SEG 运算符返回变量所在的 GROUP 还是 SEGMENT?
假设有一个名为 MY_GROUP 的 GROUP,一个名为 MY_SEG 的 SEGMENT 属于 MY_GROUP,还有一个名为 MY_VAR 的变量/标签放在 MY_SEG 中。
然后,如果我这样做
哪个值被加载到 AX 中?是 MY_GROUP 的地址还是 MY_SEG 的地址(假设它们不同)?
我在内联汇编中没有找到与该问题相关的任何命令行开关。然后我尝试了 MASM 语法:
上述两行都会导致以下错误:“仅允许段或组标签”。
请注意,我的问题仅与内联汇编有关。实际上,我将 JWASM 用于独立的组装模块,上面的语法运行良好,并且具有预期的结果。
谁能告诉我内联汇编器在这种情况下做了什么,如果有办法我可以控制它各自的行为吗?
非常感谢!
makefile - 如何在命令行上使用 Open Watcom 标记要重制的目标?
我可以像这样制作我的 Open Watcom 项目:
但是我如何重新制作或标记文件以进行重新制作?我查看了wmake
用法,那里似乎没有什么明显的。
有谁知道 Open Watcom GUI 对“Mark for Remake”做了什么?
compilation - 为什么直接访问 I/O 在英特尔 Visual Fortran 中无法正常工作
这个节目
在视觉 Fortran 中工作不正确(不正确):
结果 WATCOM(正确):
为什么?