弄了一个上午终于把问题解决了
以下的问题都是基于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重叠。下面是示意图:
转载请声明,谢谢!