数据(程序)段外使用
数据(程序)段内使用
代码段中标号一般都有“:”
非代码段中“:”一般不使用
有:与无:
:的作用是将它前面的标号标记为地址,方便cs:ip指向它(调用子程序)
而数据段中的数据一般不为指令,用不含“:”的标号表示偏移地址也表示后面的数据格式,可利用这个特性方便的引用数据段中的数据
汇编如何识别是代码段还是数据段呢,是通过assume定义
所以我们也可以在assume处将数据段定义为代码段,从而使用:来直接定位所需要的标号处数据地址
之所以assume cs:code(此处code代指代码段,可以重命名)不能去掉,是因为code段中会用到标号,assume cs:code的作用就是默认code段中的标号的段地址为cs
如果我们为数据段也通过assume指定一个段寄存器(假设为ds),那么数据段的标号默认段地址为ds
总结:
:的使用使得前面的标号成为偏移地址,而偏移地址需要搭配段地址才能使用
assume就能将标号处偏移地址与一个段寄存器相联系(段地址)
没有“:”的标号不仅表示此处的偏移地址也表示了后面的每个数据所占内存大小
例:
assume ds:Data
Data segment
a db 1,2,3,4,5
b db 0,6,7,8,9
c dw a,b
d dd a,b
Data ends
Data段中标号a中的1可以这样表示,于是有((Data * 16)+a+0)=a[0]=1,其中0为偏移量
Data段中标号b中的6可以这样表示,于是有((Data * 16)+b+1) =b[1]=6,其中1为偏移量
a[偏移量]能够表示数据是因为assume将Data与一段寄存器ds联系,Data中标号的默认段寄存器就是ds
补充:c为字型数据存储的是a,b的偏移地址
d为双字型数据存储的是a,b的段地址+偏移地址
offset a:取偏移地址
seg a:取段地址