类别是一个由程序员指定的用单引号括起来的字符串。如果一个段没有给出类别,那么,这个段的类别就为空。类别是用于段的分类,连接程序利用该类别来调整同名、同类别的段,并使它们相邻。典型的类别是"Data"和"Code"。如果指定某段的类别是"Code",那么,该段最好是代码段,这样,有的调试程序(如:CodeView)就可以顺序工作。
例如:  |       
  ||
| DATA1 | SEGMENT WORD PUBLIC "Data" | |
| … | ||
| DATA1 | ENDS | |
上述段定义说明了该段的起始地址是下一个字地址、组合类型为PUBLIC、段类别是"Data"。
段组伪指令GROUP是用于把源程序模块中若干个段结合成一个组,并对该段组定义一个段组名。段组伪指令的格式如下:
段组名 GROUP 段名[, 段名, ……]
其中:段名之间要用逗号间隔,段名也可以用表达式“SEG 变量”或“SEG 标号”。
下面举例说明段组伪指令的使用方法和作用。
| 例6.12 段组的作用 | ||||
|       
       方法1:用一个段寄存器对应二个数据段  |      
  ||||
| DATA1 | SEGMENT | ;第一个数据段 | ||
| b1 | DB 10h | |||
| DATA1 | ENDS | |||
| DATA2 | SEGMENT | ;第二个数据段 | ||
| b2 | DB 23h | |||
| DATA2 | ENDS | |||
| CODE1 | SEGMENT | |||
| ASSUME CS:CODE1, DS:DATA1 | ;(1) | |||
| START: | MOV | AX, DATA1 | ||
| MOV | DS, AX | ;(2)把数据段DATA1的段值赋给段寄存器DS | ||
| … | ||||
| MOV | BL, b1 | ;(3)引用DS来访问DATA1中的变量b1 | ||
| … | ||||
| ASSUME DS:DATA2 | ;(4) | |||
| MOV | AX, DATA2 | |||
| MOV | DS, AX | ;(5)把数据段DATA2的段值赋给段寄存器DS | ||
| … | ||||
| MOV | AL, b2 | ;(6)引用DS来访问DATA2中的变量b2 | ||
| … | ||||
| CODE1 | ENDS | |||
| END | START | |||
在上例中,语句(1)说明DS与DATA1建立联系,语句(2)对DS赋值,语句(3)用DS来访问DATA1段的变量名。语句(4)说明DS与DATA2建立联系,语句(5)对DS赋值,语句(6)用DS来访问DATA2段的变量名。
在该例子中,因为只使用一个段寄存器DS来对应二个数据段,所以,需要切换DS的对应关系(如:语句(4))。但我们也可以用段寄存器DS和ES来分别对应段DATA1和DATA2,这样,方法1就可变成方法2。
|  
 方法2:用二个段寄存器对应二个数据段  |  
  ||||
| DATA1 | SEGMENT | |||
| b1 | DB 10h | |||
| DATA1 | ENDS | |||
| DATA2 | SEGMENT | |||
| b2 | DB 23h | |||
| DATA2 | ENDS | |||
| CODE1 | SEGMENT | |||
| ASSUME CS:CODE1, DS:DATA1, ES:DATA2 | ||||
| START: | MOV | AX, DATA1 | ||
| MOV | DS, AX | ;把数据段DATA1的段值赋给段寄存器DS | ||
| MOV | AX, DATA2 | |||
| MOV | ES, AX | ;把数据段DATA2的段值赋给段寄存器ES | ||
| … | ||||
| MOV | BL, b1 | ;引用DS来访问DATA1中的变量b1 | ||
| … | ||||
| MOV | AL, b2 | ;引用ES来访问DATA2中的变量b2 | ||
| … | ||||
| CODE1 | ENDS | |||
| END | START | |||
我们还可以用段组来简化段寄存器的使用,把段DATA1和DATA2组成一个数据段。所以,把方法2再改写成方法3的形式。
|   
 方法3:用一个段组组成二个数据段  |   
  ||||
| GSEG | GROUP | DATA1, DATA2 | ;把段DATA1和DATA2定义成一个段组 | |
| DATA1 | SEGMENT | |||
| b1 | DB 10h | |||
| DATA1 | ENDS | |||
| DATA2 | SEGMENT | |||
| b2 | DB 23h | |||
| DATA2 | ENDS | |||
| CODE1 | SEGMENT | |||
| ASSUME CS:CODE1, DS:GSEG | ||||
| START: | MOV | AX, GSEG | ||
| MOV | DS, AX | ;把段组GSEG的段值赋给段寄存器DS | ||
| … | ||||
| MOV | BL, b1 | ;引用DS来访问DATA1中的变量b1 | ||
| … | ||||
| MOV | AL, b2 | ;引用DS来访问DATA2中的变量b2 | ||
| … | ||||
| CODE1 | ENDS | |||
| END | START | |||
定义段组后,段组内各段所定义的标号和变量,除了与定义它们的段起始点相关外,还与段组的起始点相关。规定如下: