MASM SEG运营商

时间:2015-06-12 10:24:56

标签: assembly masm

假设我们正在使用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)的结果是相同的。但我想肯定地知道......

非常感谢,

Binarus

1 个答案:

答案 0 :(得分:3)

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

如您所知,给定变量(通常是线性地址)具有多个逻辑地址,例如,8000h线性变量可以作为0800h:0000h0700h:1000h访问,因此。
表单MY_SEG:MY_VAR告诉汇编程序计算相对于段MY_SEG的偏移量。因此,如果MY_SEG从7000h线性开始,MY_SEG26000h线性开始,那么对于8000h变量MY_VAR,线性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指令告诉它返回段部分,即{{1 }}。

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