今天,我已经了解到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作为独立的汇编模块,上面的语法运行良好,并且具有预期的结果。
有人能告诉我内联汇编程序在这种情况下做了什么,以及是否有办法控制其各自的行为?
非常感谢!
答案 0 :(得分:1)
我认为没有办法说服OpenWatcom编译器发出基于组的段重定位。部分问题是无法声明或定义组,以便您可以在内联汇编中引用它。
但是,似乎OpenWatcom链接器将忽略重定位是基于段的事实,而是使用该段所属的组作为基础。因此,假设您正在使用wlink
,那么在您的第一个示例中,AX将加载一个指向MY_GROUP开头的段值。另一方面,如果您使用Microsoft的分段链接器,那么AX将包含指向MY_SEG的段值。