汇编之段


段的基本概念

段的起始地址一定是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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值