在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:
ASSUME段寄存器名:段名[,段寄存器名:段名,……]
其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。
在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如,
ASSUME CS:CODE1, DS:DATA1
上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。
在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段相对应。下面语句说明了段寄存器ES不与某段相对应。
ASSUME ES:NOTHING
在通常情况下,代码段的第一条语句就是用ASSUME语句来说明段寄存器与段之间的对应关系。在代码段的其它位置,还可以用另一个ASSUME语句来改变前面ASSUME语句所说明的对应关系,这样,代码段中的指令就用最近的ASSUME语句所建立的对应关系来确定指令中的有关信息。
例6.1汇编语言段及其段说明语句的作用。
DATA1SEGMENT;定义数据段DATA1
word1DW5678h
byte1DB\"ABCDEFG\"
DATA1ENDS
DATA2SEGMENT;定义数据段DATA2
word2DW1234h
word3DW9876h
DATA2ENDS
DATA3SEGMENT;定义数据段DATA3
byte2DB?
DATA3ENDS
CODE1SEGMENT;编写代码段CODE1
ASSUMECS:CODE1, DS:DATA1, ES:DATA2;(1)
MOVAX, DATA1;(2)
MOVDS, AX;(3)
MOVAX, DATA2;(4)
MOVES, AX;(5)
…
MOVAX, word1;访问段DATA1中的字变量word1
MOVword2, AX;访问段DATA2中的字变量word2
…
ASSUMEDS:DATA3, ES:NOTHING;(6)
MOVAX, DATA3
MOVDS, AX
MOVBL, byte2;访问段DATA3中的字节变量byte2
…
MOVAX, 4C00H;(7)
INT21H;(8)
CODE1 ENDS
语句(1)和(6)分别说明了段和段寄存器之间的对应关系,其中语句(6)重新说明语句(1)所指定的对应关系。
二组语句(2)和(3)、(4)和(5)实现对段寄存器DS和ES赋初值。ASSUME说明语句只起说明作用,它不会对段寄存器赋值,所以,必须对有关段寄存器赋值。在以后的其它源程序中也都是用此方法来实现对数据段寄存器赋值的。
语句(7)和(8)是调用中断21H的4CH号功能来结束本程序的执行,程序的返回代码由寄存器AL来确定。结束本程序执行的指令是所有主模块必须书写的语句。
注意:代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋值的。