2015-06-12 38 views
4

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

那么,什么是以下两个语句之间的区别:

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

回答

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_SEG2开始于6000h线性,那么对于var MY_VAR在8000h线性MY_SEG:MY_VAR为1000h而MY_SEG2:MY_VAR为2000h。

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

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

所以他们是一样的,但第二个是多余的。

+0

我一直认为MY_VAR在语法上等同于OFFSET MY_VAR。如果我是对的(可能我不是),这意味着MY_VAR转换为相对于MASM 5中的段的偏移量,但转换为相对于MASM 6中的组的偏移量。可以在这里添加更多细节(和也许纠正我错误的假设)? – Binarus

+0

@ user3239842我想,但我没有MASM来做快速测试。 MASM中的AFAIR当你执行'mov ax时,[MY_VAR]'汇编程序查找已声明MY_VAR的段并将其用于偏移量计算。您必须使用带有MY_VAR段的'ASSUME',最终汇编程序会生成段覆盖前缀。有了群体,算法稍有不同,请看[这里](http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_8/CH08-3.html#HEADING3-192)。如果您使用'mov ax,MY_VAR',我认为偏移总是相对于MY_VAR的段落 –

+0

感谢您的链接。这是一个很好而且容易理解的概要,我从MASM 6文档中以更难的方式了解了我所学到的知识。为了消除歧义,我现在用以下方法改变了所有独立的汇编代码:没有地方没有有效的ASSUME指令,每当采用SEG或OFFSET时,符号的名称都以合格形式给出,即MY_GROUP: MY_VAR或MY_SEG_MYVAR。我仍然有内联汇编相关的问题,因为我们显然不能使用ASSUME或那里的限定符号,请参阅[这里](http://stackoverflow.com/questions/30803553) – Binarus