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

    技术2022-05-19  18

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

    以下的问题都是基于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重叠。下面是示意图:

     

     

     

     

     

    转载请声明,谢谢!


    最新回复(0)