假设我们使用MASM6.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的结果是相同的。但我想确定的是..。
非常感谢,
比纳鲁斯
发布于 2015-06-13 08:13:07
在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_SEG:MY_VAR为1000 h的变量MY_VAR,MY_SEG2:MY_VAR是2000 h。
SEG指令计算逻辑地址的段部分而不是偏移量,它是用于计算偏移量的段MASM (同样是由上面给出的规则所使用的)。
在您的第一条指令中,您告诉MASM将段MY_SEG的地址(让我们离开重新定位)放在AX中(因此,如果段从5000 h开始,则AX中的值为500 h)。
在第二个指令中,您明确地告诉MASM在计算MY_VAR的偏移量时使用段MY_VAR,然后通过SEG指令,让它返回段部分,即MY_SEG。
所以他们是一样的,但第二个是多余的。
https://stackoverflow.com/questions/30800744
复制相似问题