assume伪指令用于向汇编程序说明所定义的逻辑段属于何种类型的逻辑段。说明的方法是将逻辑段的段名和对应的段寄存器关联起来。但除了CS寄存器外,其他逻辑段的地址需要程序员自己装入寄存器中。(来自清华版教材)
具体为什么,我理解如下:
dseg segment
data db '1'
dseg ends
cseg segment
assume cs:cseg,ds:dseg,es:dseg
start:
mov ax,dseg
mov ds,ax
mov dl,data;注意这里
mov ah,02h
int 21h
mov ah,4ch
int 21h
cseg ends
end start
在这样的一个程序中,当执行"mov dl,data"时,cpu知道data变量是定义在dseg段,但是怎么找到data的地址的呢?这时候assume就派上了用场,它将ds和dseg相关联。变量在dseg段,就从ds寄存器里寻址。寻址的地址在哪呢?"mov ax,dseg mov ds,ax",就起到了这样的作用,它将逻辑段的地址装入寄存器中。
为什么cs寄存器就不需要呢?人家就是这样规定的,至少在8086汇编上是这样。
assume对除了CS以外的其它段寄存器,仅仅只是关联了段名,以便在访问段内变量时程序可以知道用哪个段寄存器,并没有在程序加载时将段地址装入段寄存器。
所以,将段地址装入段寄存器的工作,必须由用户在程序中自己编写代码,并在程序开始运行时执行代码完成装入工作。
仅仅对CS段寄存器,会在关联段名的同时,在程序加载时自动将段地址装入段寄存器。
编写程序,是写给编译软件的。
由编译软件,编译成机器码,再去控制CPU。
但是,编译软件,对assume语句,并不生成机器码。
所以,必须有mov ax,data,mov ds,ax,CPU才能受控。
----
assume语句,是伪指令,仅仅是写给编译软件的。
编译软件,并不把它生成机器码。
ASSUME 是汇编语言(MASM)的伪指令,其作用只能告诉编译器(汇编器)你在这个程序中声明的所有段,无法做到将段地址写入段寄存器。
assume:段寄存器的说明语句;
在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:
ASSUME 段寄存器名:段名[,段寄存器名:段名, ……]
其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。
在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如,
ASSUME CS:CODE1, DS:DATA1
上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。
注意:代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋值的。