打开 Watcom 内联汇编 SEG 和 OFFSET 运算符
Open Watcom Inline assembly SEG and OFFSET operators
今天,我了解到 MASM 中的 SEG 运算符默认 return 是 GROUP 的地址,而不是所讨论表达式的 SEGMENT 的地址,并且有选项和方法可以覆盖它。
因为我目前正在 Open Watcom 1.9 / 16 位 DOS 中做一个复杂的项目,其中 C 和汇编(内联和独立)混合(实际上,DOS 只需要启动,然后我自己的 MINI-OS 控制),并且因为我知道 WASM 在某种程度上与 MASM 兼容,所以我有以下问题:
内联汇编取变量段时,SEG运算符return是变量所在的GROUP还是SEGMENT?
假设有一个名为MY_GROUP的GROUP,一个属于MY_GROUP的名为MY_SEG的SEGMENT,以及一个名为MY_VAR的变量/标签,它位于MY_SEG.
那么,如果我这样做
_asm {
MOV AX, SEG MY_VAR
}
哪个值加载到 AX 中?是MY_GROUP的地址还是MY_SEG的地址(假设它们不同)?
我没有在 inline 程序集中找到与该问题相关的任何命令行开关。然后我尝试了 MASM 语法:
_asm {
MOV AX, SEG MY_GROUP:MY_VAR
MOV AX, SEG MY_SEG:MY_VAR
}
以上两行都会导致以下错误:"Only segment or group label is allowed".
请注意,我的问题只与内联汇编有关。实际上,我将 JWASM 用于独立的程序集模块,并且上面的语法运行良好并且达到了预期的结果。
谁能告诉我内联汇编器在这种情况下做了什么,如果有办法控制它各自的行为?
非常感谢!
我认为没有任何方法可以说服 OpenWatcom 编译器发出基于组的段重定位。部分问题在于无法声明或定义组以便您可以在内联程序集中引用它。
但是,OpenWatcom 链接器似乎会忽略重定位是基于段的事实,而是使用段所属的组作为基础。因此,假设您使用的是 wlink
,那么在您的第一个示例中,AX 将加载一个指向 MY_GROUP 开头的段值。另一方面,如果您使用 Microsoft 的分段链接器,那么 AX 将包含一个指向 MY_SEG.
的段值
今天,我了解到 MASM 中的 SEG 运算符默认 return 是 GROUP 的地址,而不是所讨论表达式的 SEGMENT 的地址,并且有选项和方法可以覆盖它。
因为我目前正在 Open Watcom 1.9 / 16 位 DOS 中做一个复杂的项目,其中 C 和汇编(内联和独立)混合(实际上,DOS 只需要启动,然后我自己的 MINI-OS 控制),并且因为我知道 WASM 在某种程度上与 MASM 兼容,所以我有以下问题:
内联汇编取变量段时,SEG运算符return是变量所在的GROUP还是SEGMENT?
假设有一个名为MY_GROUP的GROUP,一个属于MY_GROUP的名为MY_SEG的SEGMENT,以及一个名为MY_VAR的变量/标签,它位于MY_SEG.
那么,如果我这样做
_asm {
MOV AX, SEG MY_VAR
}
哪个值加载到 AX 中?是MY_GROUP的地址还是MY_SEG的地址(假设它们不同)?
我没有在 inline 程序集中找到与该问题相关的任何命令行开关。然后我尝试了 MASM 语法:
_asm {
MOV AX, SEG MY_GROUP:MY_VAR
MOV AX, SEG MY_SEG:MY_VAR
}
以上两行都会导致以下错误:"Only segment or group label is allowed".
请注意,我的问题只与内联汇编有关。实际上,我将 JWASM 用于独立的程序集模块,并且上面的语法运行良好并且达到了预期的结果。
谁能告诉我内联汇编器在这种情况下做了什么,如果有办法控制它各自的行为?
非常感谢!
我认为没有任何方法可以说服 OpenWatcom 编译器发出基于组的段重定位。部分问题在于无法声明或定义组以便您可以在内联程序集中引用它。
但是,OpenWatcom 链接器似乎会忽略重定位是基于段的事实,而是使用段所属的组作为基础。因此,假设您使用的是 wlink
,那么在您的第一个示例中,AX 将加载一个指向 MY_GROUP 开头的段值。另一方面,如果您使用 Microsoft 的分段链接器,那么 AX 将包含一个指向 MY_SEG.