作用:用于标识默认段前缀
解释:assume 并不能改变ds等段寄存器的值,但他能改变编译器产生的汇编代码。比如:
assume ss:stack
stack segment
x :db 0
stack ends
如果程序需要mov ax,[x],那么程序如何定位[x]呢?我们知道x只是一个偏移地址0,所以此时assume就相当于告诉编译器stack段的所有标号都与ss相关联,所以此时[x]就相当于ss:[0].如果我们直接将这句改为mov ax,ss:[0],那么前面不加assume也是可以的.这也是为什么[0]被编译器强制理解为立即数,而[标号]却被理解为标号里的内容的原因,因为标号必须与段assume,否则会报错cannot address with segment register.而[0]无默认段,就只能被认为为立即数了.
所以,我们仍需在程序中将ss的值,用指令修改为stack,原因就是assume并不会修改段寄存器,这个由dos系统决定,如果dos系统决定将段值编译进.exe文件头,并在加载进内存时根据文件头,修改段值,那么此时assume就相当于可以改变段值了.但是我调试的现实是ds、es指向psp头(psp详见16位exe程序加载过程),ss指向ds+0:00f0,cs指向ds+0:0100。