注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

11章 段描述符: 用C写的段描述符生成小程序  

2013-02-15 12:43:30|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

段描述符占8字节,64位.

描述符低32位: 低16位为段界限的0~15位(低16位)  高16位为段基地址的0~15位(低16位)

描述符高32位: 低8位(0~7)为段基地址的16~23位 高8位(24~31)为段基地址的24~31位 段基地址为32位

 位(8~11)为TYPE字段(代码段XCRA 数据段XEWA)

 位(12)为S位(系统段还是代码段或数据段)

 位(13 14) 为DPL特权级别(取值0~3)

 位(15) 为P 段存在位(1为存在内存中,0为不存在)

 位(16~19)为段界限的(16~19),也就是高4位 段界限共20位

 位(20) AVL 软件位

 位(21) L位(64位代码段标志)

 位(22) D/B位(默认的操作数大小或默认的栈指针大小) 0为16位,1为32位

 位(23) G位(段粒度位) 0为字节,1为4KB

 

C源代码如下:

#include <stdio.h>
int main(void)
{
 // 段描述符生成小程序
 // djdz(段基地址) djx(段界限) mbsza(描述符低32位) mbszb(描述符高32位)
 unsigned long djdz,djx,lsa,lsb,mbsza,mbszb;
 djdz=djx=lsa=lsb=mbsza=mbszb=0;
 printf("请输入段基地址(十六进制格式输入,最大值FFFF FFFF):");
 scanf("%lx",&djdz);
 printf("请输入段界限(十六进制格式输入,最大值 F FFFF):");
 scanf("%lx",&djx);
 lsa=djx & 0xffff;
 mbsza=djdz << 16;
 mbsza=mbsza | lsa;

 lsa=djdz & 0xff000000; //取得段基地址的高8位
 mbszb=mbszb | lsa;
 lsa=(djdz >> 16) & 0xff; //取得段基地址的16~23位
 mbszb=mbszb | lsa;
 lsa=djx & 0xf0000 ; //取得段界限的高4位,也就是16-19位
 mbszb=mbszb | lsa ;
 lsa=0;
 printf("请设定G位(段粒度),0为字节,1为4KB:");
 scanf("%d",&lsa);
 if (lsa!=0)  mbszb=mbszb | 0x800000 ; //修改描述符
 printf("请设定D/B位(默认的操作数大小或默认的栈指针大小),0为16位,1为32位:");
 scanf("%d",&lsa);
 if (lsa!=0) mbszb=mbszb | 0x400000 ; //修改描述符
 printf("请设定P位(段是否存在于内存中),0为不存在,1为存在:");
 scanf("%d",&lsa);
 if (lsa!=0) mbszb=mbszb | 0x8000;
 printf("请设定S位(0表示系统段,1表示代码段或者数据段):");
 scanf("%d",&lsa);
 if (lsa!=0) mbszb=mbszb | 0x1000;
 while (1) {
  printf("请设定DPL(特权级别),取值为0~3:");
  scanf("%d",&lsa);
   if (( lsa >=0) && (lsa<=3)) break;
   printf("输入错误,请重新输入!取值为0~3:\n");
   }
 if (lsa!=0) { lsa=lsa << 13;
  mbszb=mbszb | lsa;
 }
 printf("段的TYTE字段(子类型)设定:\n\n");  
 printf("X位设定(段是否可执行),数据段为0,代码段为1:");
 scanf("%d",&lsa);
 if (lsa!=0) { printf("您已选择了代码段,请继续设定段是否为特权级依从的,0为非依从,1为依从:");
        scanf("%d",&lsa);
        if (lsa !=0) lsb= 12;
        else lsb=  8;
        printf("请继续设定代码段是否可读,0为不可读,1为可读:");
        scanf("%d",&lsa);
        if (lsa!=0) lsb=lsb | 2 ;
              }
    else {  printf("您已选择了数据段,请继续设定段的扩展方向,0为向上扩展,1为向下扩展:");
       scanf("%d",&lsa);
       if (lsa!=0) lsb= 4;
       printf("请继续设定段是否可写,0为不可写,1为可写:");
       scanf("%d",&lsa);
       if (lsa!=0) lsb=lsb | 2;
     }     
 lsb=lsb << 8;     
 mbszb=mbszb | lsb;     
 printf("描述符低32位: %#010lx\n",mbsza);     
 printf("描述符高32位: %#010lx\n",mbszb); 
 return 0;
}

  评论这张
 
阅读(60)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017