繁体   English   中英

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

[英]Open Watcom Inline assembly SEG and OFFSET operators

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

由于我当前在Open Watcom 1.9 / 16位DOS中执行一个复杂的项目,其中C和程序集(内联和独立)混合使用(实际上,DOS仅在启动时才需要,然后由我自己的MINI-OS进行控制),并且由于我知道WASM在某种程度上与MASM兼容,我有以下问题:

在进行内联汇编并获取变量的分段时,SEG操作员是否返回变量所在的GROUP或SEGMENT?

假设有一个名为MY_GROUP的GROUP,一个属于MY_GROUP的名为MY_SEG的SEGMENT和一个位于MY_SEG中的名为MY_VAR的变量/标签。

那我做的话

_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的分段值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM