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:0000h
或 0700h:1000h
和如此。
MY_SEG:MY_VAR
形式告诉汇编程序计算相对于段 MY_SEG
的偏移量。因此,如果 MY_SEG 从 7000h
线性开始,MY_SEG2
从 6000h
线性开始,那么对于一个 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
。
所以它们是相同的,但第二个是多余的。
假设我们正在使用 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:0000h
或 0700h:1000h
和如此。
MY_SEG:MY_VAR
形式告诉汇编程序计算相对于段 MY_SEG
的偏移量。因此,如果 MY_SEG 从 7000h
线性开始,MY_SEG2
从 6000h
线性开始,那么对于一个 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
。
所以它们是相同的,但第二个是多余的。