Tag: watcom

打开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且属于MY_GROUP的SEGMENT,以及一个名为MY_VAR的变量/标签,它位于MY_SEG中。 然后,如果我这样做 _asm { MOV AX, SEG MY_VAR } 哪个值加载到AX? 它是MY_GROUP的地址还是MY_SEG的地址(假设它们不同)? 我没有找到任何与内联汇编中的问题相关的命令行开关。 然后我尝试了MASM语法: _asm { MOV AX, SEG MY_GROUP:MY_VAR MOV AX, SEG MY_SEG:MY_VAR } 上述两行都会导致以下错误:“只允许段或组标签”。 请注意,我的问题仅与内联汇编有关。 实际上,我使用JWASM作为独立的汇编模块,上面的语法效果很好,并且具有预期的结果。 有人能告诉我内联汇编程序在这种情况下做了什么,以及是否有办法控制其各自的行为? 非常感谢你!

在32位Open Watcom C中生成FAR跳转指令

我需要生成一个远跳指令来跳转到另一个ISR(中断服务程序)。 我正在开发一个32位FreeDOS应用程序。 在阅读了OW手册( cguide.pdf和clr.pdf )之后,我想出了两种无需 任何警告或错误即可成功编译的方法。 /* Code Snippet #1 */ #pragma aux old08 aborts ; void (__interrupt __far *old08)(void); // function pointer declaration void __interrupt __far new08(void) { /* Do some processing here … */ (*old08)(); /* OW will now generate a jump inst. instead of call*/ } 我想出的另一种方法是: /* Code Snippet #2 */ […]

如何组装GAS组件并将其与Open Watcom C库链接?

我试图生成16位DOS可执行文件,但使用gcc编译器。 所以我使用古老的gcc-4.3 ia16端口。 我创建了我的构建的Docker镜像: https : //registry.hub.docker.com/u/ysangkok/ia16-gcc-rask 这是我正在尝试的: host $ mkdir results host $ docker run -v $PWD/results:/results -it ysangkok/ia16-gcc-rask container $ cd results 我没有包含头文件,导致gcc无法使用OpenWatcom的libc头文件。 container $ echo ‘main() { printf(“lol”); }’ > test.c 我没有链接因为我没有16位binutils可用。 如果我构建一个目标文件,它没有正确标记为16位。 container $ /trunk/build-ia16-master/prefix/bin/ia16-unknown-elf-gcc -S test.c 现在我有这个汇编文件: .arch i8086,jumps .code16 .att_syntax prefix #NO_APP .section .rodata .LC0: .string “lol” .text .p2align […]