段的基本概念
段的起始地址一定是16的倍数。
段的大小一定是16的倍数
一个段的最大长度是64KB
段中定义一些数据
dest_buffer和source_buffer就是名字,代表了这段空间的首地址。
(?)表示初始值随便。
都放在一个段是什么样?分几个段是什么样?
段实际占用的空间大小
王爽老师汇编语言P135
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为?
段的实际占用空间
也就是说,段的大小一定是16的倍数,但你也可以在段里定义不是16的倍数的m个字节,这种情况下段里就有剩下的空白的段单元。因为存储器是以字节来组织的,也可以说有些字节大小的内存单元空在那了,没有存放东西。
所以你也可以在段里定义17个字节,31个字节,但是系统分配空间是16个16个的分配,所以这两种情况你段的大小都是32。
这两句汇编明显是在数据段里定义了40个字节型数据,并且值全部是a,source_buffer代表这段数据空间的首地址。
40个字节型数据,显然占40个字节。(这话说起来很傻,但是要明白40个字型数据占的就是80个字节了)
但是如果问你数据段的大小是多少?答案是3*16=48
到这里我们也能看出来,汇编中一个段的大小和这个段里面定义的数据息息相关!一个段有N个字节,那么该段实际占有空间为16*(N/16 + 1)个字节。同样如果这个段里面没有定义数据,那么系统不会给这个段分配空间!
如果汇编这样写,那这两句话就是纯粹的废话。因为段里没有定义数据,你这个段相当于没定义。
段的地址(段在内存中的位置)
data就是一个标号,是这个段的名称,这个段的名称最终将被编译,连接程序处理为一个段的段地址(P79)
简单的说:
段名就相当于一个标号,它代表了段地址。
并且
段的地址,也就是data的值,是系统自动分配的!不是人为设置的。
实际上这种分配是按着定义的顺序来的。参见王爽老师《汇编语言》P134练习题,很明显data段,stack段,code段是按照定义的顺序在内存中顺序分布的。
关于段的一篇特别好的博文
汇编中的分段和段地址的定位
程序运行前,ds,es这些都还没被赋值呢,运行之后,系统会给数据段分配一个地址,给附加段分配一个地址,然后执行到
mov ax,data
mov ds,ax
这些语句时,ds,es也会被赋上值,之后再做汇编操作(比如串传送)就可以用ds,es等了。
段的在程序中的应用
这是典型的定义数据段和附加段的汇编语句。
data segment
data ends
是一对成对使用的伪指令,也是写汇编程序时必须要用到的一对伪指令。
因为一个有意义的汇编程序中至少要有一个段。
segment和ends的作用是定义一个段,segment说明一个段开始,ends说明一个段结束。
因为我们定义了段,所以要在前面加上assume ds:data
代码段中也要有
mov ax,data
mov ds,ax