【笔记】汇编..主要讲段 段寄存器 用段寄存器来看更多的比如20位的方法 FFFF:FFFF

1个字=2个字节=2*8位计算机按字节存储
    一个存储单元中存放的信息是该存储单元的内容{不理解~,不重要}
    *大部分数据是以16位来显示的 字单元 1111 1111 1111 1111 F F F F
    下图1:(0004H)=34H
    
        
    
    16位字长的机器,可以访问最多64K字节,
    而8086/8088有20根地址,可直接寻址的物理地址空间为1M字节
    所以要访问1M的必须有20位地址,
        但是16进制表示1M字节的地址范围应该为00000~FFFFF
                    //2^16+2^4=多加了4个位也就是多了一个F
    *那么,在16位字长的机器里,用什么方法来表示20地址???//存储器是:
        *采用存储器地址分段~??//怎么分   就是啊  FFFF0   这个FFFF是一个组  而0是一个组
    *就是在编程的时候把存储器划分成段,每个段的大小可达64K,//怎么弄?最大就是FFFF                            
    这样段内地址可以用16位表示。
        段与段之间可以相连,也可以不相连,还可重叠
    
    但IBM PC机对起始地址有限制,段不能起始于任何地址,而必须从任一小段的首地址开始。//[死去吧...]
    
//分段
    机器规定:从0地址开始,每16个字节为一个小段(16的倍数  FFFF:FFFF:FFFF//划段大概就是这种格式)
    下面列出了存储器最低地址区的地址区间,每行为一段
         00000, 00001, 00002, ....., 0000E, 0000F;
        00010, 00011, 00012, ....., 0001E, 0001F;
        00020, 00021, 00022, ....., 0002E, 0002F;
            .....
    第一列就是每个小段的首地址,其特征是:在16进制表示的地址中,最低为0(即20位地址的低4位为0)    
                        // 0000|0 
                        // 0001|0  
                        // 0002|0  其实这个就是2^16位列找,2^4位行找,这就是分段 牛!!
                        // ....
                        // FFFF|0, .....FFFF|F  哈哈哈 搞懂了 
                        
    *-*在1M字节的存储器里
        每一个存储单元都有一个唯一的20位地址(ffff:f)。称为:
                存储单元的物理地址
        /*
            cpu访问存储器时,必须先确定
            所要访问的存储单元的物理地址才能取得(或存入)该单元中的内容。
            
              其中,要访问的存储单元是属于某个段的。
               把存储单元的地址与所在段的起始地址的差称为段内偏移,简称为偏移。(好比FFFF:E 偏移就是E)
            在一个段内,通过偏移可指定要访问的存储单元,或者说要访问的存储单元可以由偏移来指定。
            在整个1M地址空间中,存储单元的物理地址等于段起始地址加上偏移。
                     
        */
        逻辑地址:段值和偏移两个部分组成
            形式:段值:偏移
        根据逻辑地址可以方便的得到存储单元的物理地址,公式如下:
            物理地址=段值*16+偏移
            //    ↓↓↓    ↓↓↓
            //FFFF:E=FFFF*16+E  -> FFFFE
        所以20位物理地址由:16位段地址和16位偏移地址组成。
        
        段地址是指每一段的起始地址,由于它必须是小段的首地址,所以其低4位一定是0。如图2示:
            
                    
            
            
            
        
        例如:用16进制表示的逻辑地址1234:3456所对应的存储单元的物理地址为:
            物理地址=12340+3456=15796H
            
        
        **重叠段,所以一个物理地址可用多个逻辑地址表示。如 :图3
            
            
                    
            
            
            
            其中:存储单元的物理地址是12345H;
            标出的:两个重叠的段值分别是:1002H和1233H,在对应段内的偏移分别是2325H和0015H。
/*在算物理地址的时候可以由多重叠就好比 12345=1000+2345 也可以使 1234+0005  就是最后的十六位可以重叠  但是段值的最后一位必须为0,否则就找不到了 因为1000是16位的地址不可以超过   ,,,,还有一个就是 1002:2325 和 1233:0015也是一样的地址12345H*/    
            用了段值和偏移构造逻辑地址后,段值由段寄存器给出,偏移可由指令指针IP、堆栈指针、SP和其他可作为存储器指针使用的寄存器(SI、DI、BX、和BP)给出,偏移还可直接用16位数给出。//就是段由段寄存器给,,,偏移由其他小的如IP  SP(SI,DI,BX,BP)等 还有16位的地址给
            
            指令中不使用物理地址,而是使用逻辑地址,由总线接口单元BIU按需要根据段值和偏移自动形成20位物理地址。
            
    段寄存器的引用    {CS DS ES SS}
        取指令自动引用代码段寄存器CS,再加上由IP给的16位偏移,得到要取指令的物理地址。
        堆栈操作时,自动引用SS[堆栈寄存器],再加上SP所给的16位偏移,得到堆栈操作所需的物理地址。
        偏移用到BP,缺省引用SS
        存取一个普通的操作数,则自动选择数据寄存器DS或附加段寄存器ES,如果再加上16位偏移,得到存储器操作数的物理地址。//[这个总觉得不懂也可]
        
        如果某个程序的数据区超过64K字节,那么就要在两个或者多个数据段中存取数据[可略..不看....]
        
        举点例子:
            1.最多可有64K个字节 
            
        
        
        
            
        
        
原文地址:https://www.cnblogs.com/xiguayizu/p/3345464.html