这几天在看王爽大大的 汇编语言。对于assume伪指令却很是不懂。
比如已经定义了assume cs:code,ds:data
但用debug观察的时候,发现ds段寄存器却没有相关联的数据。
必须在cs中写明: mov ax,data
mov ds,ax
然后才能发现ds中有正确的数据。
于是疑惑,assume不是已经关联了ds嘛?
上网求助 = =、 然后找到答案。
编写程序,是写给编译软件的。由编译软件,编译成机器码,再去控制CPU。但是,编译软件,对assume语句,并不生成机器码。
所以,必须有mov ax,data,mov ds,ax,CPU才能受控。
---assume语句,是伪指令,仅仅是写给编译软件的。编译软件,并不把它生成机器码。
assume对除了CS以外的其它段寄存器,仅仅只是关联了段名,以便在访问段内变量时程序可以知道用哪个段寄存器,并没有在程序加载时将段地址装入段寄存器。
所以,将段地址装入段寄存器的工作,必须由用户在程序中自己编写代码,并在程序开始运行时执行代码完成装入工作。 仅仅对CS段寄存器,会在关联段名的同时,在程序加载时自动将段地址装入段寄存器。
----补充:前天知道了答案后,我以为assume ds:data 之类的指没有什么用,只是给程序员看的。
但今天发现不是这样的。 如果你在data中用了标号的话,则assume ds:data不能省略。
比如:
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
data ends
a,b的后面没有“ :”。 如果你想在cs段中用数据标号访问数据,则必须在开头加上assume ds:data,否则会报错
Arror A2068:Can not address with segment register
不过就算在开头加上了assume ds:data,代码段中也不能少了mov ax,data,mov ds,ax。