假设我们正在使用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
答案 0 :(得分:3)
在MASM中,标签MY_VAR
转换为MY_VAR地址相对于声明的段的偏移部分(如果您使用它像mov ax, MY_VAR
)或相对于您假设的段对于您用来访问它的段寄存器(如果您像mov ax, WORD PTR [MY_VAR]
一样使用它)。
如您所知,给定变量(通常是线性地址)具有多个逻辑地址,例如,8000h
线性变量可以作为0800h:0000h
或0700h:1000h
访问,因此。
表单MY_SEG:MY_VAR
告诉汇编程序计算相对于段MY_SEG
的偏移量。因此,如果MY_SEG从7000h
线性开始,MY_SEG2
从6000h
线性开始,那么对于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 }}。
所以它们是相同的,但第二个是多余的。