以下都是我自己分析的,请大神来指点迷津,只是从实验的现象来总结的,并未从真正的本质入手的,只是学习到第16章的时候犯嘀咕,所以也别用太深奥的知识来说明。
assume是一定要写的吗?
答案是不一定的
code segment
mov ax, 4c00h
int 21h
code ends
end
调试后寄存器的状态,在没有代码开始的标号时,CS = 076A,IP = 0000, DS = 075A的,符合书本上说的,前256个字节是空出来的(这个我还不懂),程序真正的入口是第256个字节开始的。当然你前面写的不是代码段,你不指名入口,程序的入口依然是第256个字节开始。
如果出现标号加冒号,那么情况就有所改变了。
首先,标号加冒号里面存的是一条代码的偏移地址,就存在个问题。那么段地址在哪。
我们必须加上assume cs:code时,才能正常编译,这时就知道了,段地址在CS中,如代码:
assume cs:code
code segment
a: db 0, 0, 0
start:
mov ax, 4c00h
int 21h
code ends
end start
但如果,你的标号加冒号是在其他段的,那么编译不成功的。只有放在代码段中才可以被编译成功,那么我猜,标号+冒号一定要在代码段中,因为它的段地址就是CS的值。
最后一点,就是出现多个段的时候,为什么要assume cs:code, ds:data, ss:stack,我之前写实验也就写了一个assume cs:code而已,后来通过实验发现了:
首先assume是伪指令,它不会被执行,自然也就不会改变寄存器的值。简单来说。ds:data他并没有改变ds的值,只是关联上了,当data段中出现标号是。说明了,偏移地址有了,缺少一个段地址,那么这个段地址就是关联的寄存器的值了,举个例子
assume es:data, cs:code
data segment
a db 2,3
data ends
code segment
start:
mov ax, data
mov ds, ax
mov al, [a]
mov ax, 4c00h
int 21h
code ends
end start
小小总结下:
当出现标号+冒号时,这时候一定要关联到CS中,因为他们的段地址一定要在CS中。
其次。若在其他段中出现标号不+冒号。那么他们的段地址就在关联的寄存器中。
如果没有标号的话,段地址默认在DS中,比如代码:
assume es:data, cs:code
data segment
db 2,3
data ends
code segment
start:
mov bx, 1
mov ax, [bx]
mov ax, 4c00h
int 21h
code ends
end start
哪怕这个时候关联到es上,段地址用的还是DS的值。我只能这么理解。就是这个bx中的1,并非data中数据的偏移地址。
还有很多问题没有说清,但是对于知识面不广的我来说已经够了。虽然只是实验的结果。真正的原因可能还要继续学习才知道,以后会用一个比较严谨的说法来讨论这件事,希望大神给予意见。