今天,我了解到,默认情况下,MASM中的SEG运算符返回组的地址,而不是该表达式段的地址,并且有一些选项和方法可以覆盖该地址。
由于我目前正在Open 1.9 / 16位DOS中执行一个复杂的项目,其中C和程序集(内联和独立)混合在一起(实际上,DOS只需要启动,那么我自己的MINI-OS就可以控制),而且由于我知道WASM在某种程度上是MASM兼容的,我有以下问题:
当执行内联程序集并获取变量段时,SEG运算符返回变量所在的组还是段?
假设有一个名为MY_GROUP的组、一个属于MY_GROUP的名为MY_SEG的段和一个放置在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作为独立的组装模块,上面的语法很好,并且符合预期的结果。
有人能告诉我内联汇编程序在这种情况下做什么吗?如果有什么方法,我可以控制它各自的行为吗?
非常感谢!
发布于 2015-06-12 21:56:49
我不认为有任何方法可以说服OpenWatcom编译器发出基于组的段重定位。部分问题是,无法声明或定义组,以便您可以在内联程序集中引用它。
然而,似乎OpenWatcom链接器将忽略这样一个事实,即重定位是基于段的,而是使用该段所属的组作为基。因此,假设您使用的是wlink,那么在您的第一个示例中,AX将加载一个段值,该值指向MY_GROUP的开始。另一方面,如果使用微软的分段链接器,则AX将包含指向MY_SEG的段值。
https://stackoverflow.com/questions/30803553
复制相似问题