MASM SEG 运算符

MASM SEG operator

假设我们正在使用 MASM 6.1/16 位/大数据模型编写汇编代码,并且我们有一个名为 MY_VAR 的变量(标签)、一个名为 MY_SEG 的段和一个段组命名为 MY_GROUP。假设 MY_VAR 放在 MY_SEG 中,而 MY_SEG 属于 MY_GROUP.

那么,下面两种说法有什么区别:

1) MOV AX, MY_SEG
2) MOV AX, SEG MY_SEG:MY_VAR

另外,下面两种说法有什么区别:

1) MOV AX, MY_GROUP
2) MOV AX, SEG MY_GROUP:MY_VAR

注意:MASM 愉快地处理所有这些语句。正如预期的那样(在我的例子中),每个 1) 和 2) 的结果都是相同的。但我想确定...

非常感谢,

双鱼座

在 MASM 中,标签 MY_VAR 转换为 MY_VAR 地址的偏移部分,相对于它在其中声明的段(如果你像 mov ax, MY_VAR 一样使用它)或相对您假设用于访问它的段寄存器的 to 段(如果您像 mov ax, WORD PTR [MY_VAR] 那样使用它)。

如你所知,一个给定的变量(通常是一个线性地址)有多个逻辑地址,例如 8000h 线性的变量可以被访问为 0800h:0000h0700h:1000h 和如此。
MY_SEG:MY_VAR 形式告诉汇编程序计算相对于段 MY_SEG 的偏移量。因此,如果 MY_SEG 从 7000h 线性开始,MY_SEG26000h 线性开始,那么对于一个 var MY_VAR 在 8000h 线性 MY_SEG:MY_VAR是 1000h,MY_SEG2:MY_VAR 是 2000h。

SEG 指令计算逻辑地址的段部分而不是偏移量,它是 MASM 使用的段(同样按照上面给出的规则)计算偏移量。

在您的第一条指令中,您告诉 MASM 将段 MY_SEG 的地址(让我们留下重定位)放在 AX 中(因此,如果该段从 5000h 开始,则 AX 中的值为 500h)。
在您的第二条指令中,您明确告诉 MASM 使用段 MY_SEG 计算 MY_VAR 的偏移量,然后通过 SEG 指令告诉它 return 段部分代替,即 MY_SEG

所以它们是相同的,但第二个是多余的。