关于汇编 段 大小的几个困惑

弄了一个上午终于把问题解决了

以下的问题都是基于8086机器上的

 ------------------------------------------------------------------------------------

                                             美丽的分界线

 ------------------------------------------------------------------------------------

问题一:为什么段最小为16byte?

 

理解:首先理解分段标准,在8086中寻址方式为段地址*16 +偏移地址

        所以分段的依据是段地址,即不同的段的段地址是不同的。

        当偏移地址相同时,两个相邻的段的最短距离为16个byte。

 

例如:设段A 段地址为 0001。则段A的起始物理位置是 0001*16+0  =  10h(偏移地址为0)

          段B  段地址为 0002。则段B的起始物理位置为 0002*16+0  =  20h(偏移地址为0)

         那么段A的长度为20h - 10 h = 10h = 16;

         所以段A的长度为 16 个 byte(内存操作的最小单元)

 

------------------------------------------------------------------------------------

                                               美丽的分界线

------------------------------------------------------------------------------------

问题二:为什么段最大为64byte?

 

理解 :一个段的最大空间决定于一个段的偏移地址:一个4位的16进制数,也就是一共可以表示16^4

         = 65536  个byte=  64byte。

 

例如 :段A的段地址为 0001.偏移地址可以为 0000h 到 ffffh 一共是65536个内存单位即64个byte。

 

------------------------------------------------------------------------------------

                                              美丽的分界线

------------------------------------------------------------------------------------

 

问题三:段的大小可以为17byte吗?

 

理解;有了上面两问的基础后,我们知道段的大小可以是在 16byte 到 64byte 之间,于是有些初学的

        童鞋认为这是可以的。但是实际上8086的cpu对段的大小有着另外的一个规定:

        段不能起始于任意地址,而必须从任一小段的首地址开始。机器规定:从0地址开始,每16个字节

        为一小段。

           -------------------------ibm-pc汇编语言程序设计(第二版) 清华大学出版社出版 P27

        也就是说   段的大小只能是16的倍数。

        所以答案是不可以的。

 

例如:定义下面的段

        name segment

          ...

        name ends

        如果段中的数据占N个字节,则程序加载后,该段实际占有的空间是多少呢?

        -------------------------王爽老师的汇编程序设计 (第二版) P135

        个人答案是((N-1)/16 + 1)*16   //**注意“/”是整除**//

        因为不足16byte也算16byte。

 

 

------------------------------------------------------------------------------------

                                             美丽的分界线

------------------------------------------------------------------------------------

 

 

问题4,如何理解段的重叠?

 

理解,例子:

        设段A的大小为32byte,段地址为0001,则起始物理地址为0001:0000 = 0010h,终点地址为

        0001:001f = 002fh .

           段B的大小为32byte,段地址为0002, 且起始物理地址为0002:0000 =  0020h,终点地址为

        0002: 001f = 003fh .

        那么A∩B = 0020h 就是说段A与段B公用物理地址为0020h ~ 002f 这个长度为10的一个段,也

        就是说段A与段B重叠。下面是示意图:

 

 

 

 

 

转载请声明,谢谢!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值