打开Watcom内联汇编SEG和OFFSET运算符

时间:2015-06-12 12:50:09

标签: c assembly memory-address watcom

今天,我已经了解到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作为独立的汇编模块,上面的语法运行良好,并且具有预期的结果。

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

非常感谢!

1 个答案:

答案 0 :(得分:1)

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

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