首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打开Watcom内联程序集SEG和偏移操作符

打开Watcom内联程序集SEG和偏移操作符
EN

Stack Overflow用户
提问于 2015-06-12 12:50:08
回答 1查看 1K关注 0票数 1

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

由于我目前正在Open 1.9 / 16位DOS中执行一个复杂的项目,其中C和程序集(内联和独立)混合在一起(实际上,DOS只需要启动,那么我自己的MINI-OS就可以控制),而且由于我知道WASM在某种程度上是MASM兼容的,我有以下问题:

当执行内联程序集并获取变量段时,SEG运算符返回变量所在的组还是段?

假设有一个名为MY_GROUP的组、一个属于MY_GROUP的名为MY_SEG的段和一个放置在MY_SEG中的名为MY_VAR的变量/标签。

如果我这么做了

代码语言:javascript
复制
_asm {
MOV AX, SEG MY_VAR
}

哪个值加载到AX中?它是MY_GROUP的地址还是MY_SEG的地址(假设它们是不同的)?

我没有找到任何与内联程序集中的问题相关的命令行开关。然后我尝试了MASM语法:

代码语言:javascript
复制
_asm {
MOV AX, SEG MY_GROUP:MY_VAR
MOV AX, SEG MY_SEG:MY_VAR
}

以上两行都会导致以下错误:“只允许段或组标签”。

请注意,我的问题只与内联程序集有关。实际上,我使用JWASM作为独立的组装模块,上面的语法很好,并且符合预期的结果。

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

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-12 21:56:49

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30803553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档