打开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作为独立的汇编模块,上面的语法效果很好,并且具有预期的结果。

有人能告诉我内联汇编程序在这种情况下做了什么,以及是否有办法控制其各自的行为?

非常感谢你!

我认为没有办法说服OpenWatcom编译器发出基于组的段重定位。 部分问题是无法声明或定义组,以便您可以在内联汇编中引用它。

但是,看起来OpenWatcom链接器将忽略重定位是基于段的事实,而是使用该段所属的组作为基础。 因此,假设您正在使用wlink那么在您的第一个示例中,AX将加载一个指向MY_GROUP开头的段值。 另一方面,如果您使用Microsoft的分段链接器,那么AX将包含指向MY_SEG的段值。