打开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的段值。