1

今天,我了解到 MASM 中的 SEG 运算符默认返回 GROUP 的地址,而不是相关表达式的 SEGMENT 的地址,并且有一些选项和方法可以覆盖它。

由于我目前在 Open Watcom 1.9 / 16 位 DOS 中做一个复杂的项目,其中混合了 C 和汇编(内联和独立)(实际上,只需要 DOS 来启动,然后我自己的 MINI-OS 控制),因为我知道 WASM 在某种程度上兼容 MASM,我有以下问题:

在进行内联汇编并取变量的段时,SEG 运算符返回变量所在的 GROUP 还是 SEGMENT?

假设有一个名为 MY_GROUP 的 GROUP,一个名为 MY_SEG 的 SEGMENT 属于 MY_GROUP,还有一个名为 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 用于独立的组装模块,上面的语法运行良好,并且具有预期的结果。

谁能告诉我内联汇编器在这种情况下做了什么,如果有办法我可以控制它各自的行为吗?

非常感谢!

4

1 回答 1

1

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

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

于 2015-06-12T21:56:49.687 回答