• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-26
  • 语言: 其他
  • 标签: fasd  

资源简介

编程演示三种存储管理方式的地址换算过程:1、分页方式的地址换算2、分段方式的地址换算3、段页式的地址换算

资源截图

代码片段和文件信息

#include   
#include 

int page(int Aint L );
int Segment(int snint sl);
int SegPagt(int snint pnint pd);
typedef struct segtable 
{
int segf[256];
int segl[256];
}segtable;
struct segtable st;


typedef struct segpagt
{
int segf[256];
int segl[256];
int ptl[256];
int pt[256];
int pf[256];
int pl;
}segpagt;
struct segpagt sp;
int main()
{
 int code;
 int plpasnsdpdpn;
 //const int ptl ;
 int temp;
 do{
  printf(“         成员:欧剑明,陈羽,任家跃\n“);
  printf(“----------------地址换算过程----------------------------\n\n“);
  printf(“  1.分页式地址换算\n“);
  printf(“  2.分段式地址换算\n“);
  printf(“  3.段页式地址换算\n“);
  printf(“  4.结束运行\n\n“);
 printf(“----------------------------------------------------------\n“);
 printf(“请输入您的选择:“);
 
  scanf(“%d“&code);
  switch(code)
  {
  case 1:{
   printf(“注意:请演示设定页表长度小于256\n“);
   printf(“请输入换算的逻辑地址:\n“);
   scanf(“%d“&pa);
   printf(“页面大小(B):\n“);
   scanf(“%d“&pl);
      page(papl);
      }break;
  case 2:{
   printf(“请演示设定段表长度小于256\n“);
   printf(“请输入逻辑地址的段号:\n“);
   scanf(“%d“&sn);
   printf(“段内地址:\n“);
   scanf(“%d“&sd);
   Segment(snsd);
       }break;
  case 3:{
      
      printf(“预设定段表长为256页面大小为256\n“);
  printf(“请输入逻辑地址的段号:\n“);
      scanf(“%d“&sn);
      printf(“页号:\n“);
      scanf(“%d“&pn);
      printf(“页内地址:\n“);
      scanf(“%d“&pd);
      SegPagt(snpnpd);
      }break;
  case 4:{}break;
  }
 }while (code<4);
}

int page(int Aint L)
{
 int dPkdi;
 int WD;
 int PT[256];
 for(i=1;i<256;i++)
 {
 PT[i]=rand() %512;//定义随机产生的快号在1到512之间
 }

 P=A/L;//页号等于逻辑地址/页面大小
 d=A%L;//页内地址=逻辑地址%页面大小

 if(P>L) printf(“页号大于页表长度越界中断\n\n“);//如果页号大于页表长度,输出越界中段
 else {
    printf(“页号=逻辑地址/页面大小=%d页内地址=逻辑地址%页面大小=%d\n“Pd);//输出页号和页内地址
    kd=PT[P];//根据页号随机产生快号
    printf(“根据页号%d得到块号%d\n“Pkd);
    WD=kd*L+d;//计算物理地址的公式
    printf(“物理地址=块号%d*页面大小%d+页内地址%d\n“kdLd);//输出物理地址=块号*页面大小+页内地址
    printf(“逻辑地址%d换算后的物理地址为%d\n\n“AWD);//输出物理地址的结果
    return (0);
 }
 }



int Segment(int snint sd)
{
int iwd;

for(i=0;i<255;i++)
{
st.segf[i]=rand()%255;//定义随机产生段首地址为1到255之间
st.segl[i]=rand()%2048;//定义随机产生段长度为1到2048之间
}
if(sn>256) printf(“段号%d大于段表长度256越界中断\n\n“sn);//如果段号大于段表长度,输出越界中断
else if(sd>st.segl[sn]) printf(“段内地址%d大于段长度%d越界中断\n“sdst.segl[sn]);//如果段内地址大于段长度,输出越界中断
else{
printf(“根据段号找到段首地址%d\n“st.segf[sn]);
   printf(“物理地址=段首地址%d+段内地址%d\n“st.segf[sn]sd); //输出物理地址=段首地址+段内地址
 wd=st.segf[sn]+sd;//计算物理地址的算法
 printf(“换算得到的物理地址为:%d\n\n“wd);//输出物理地址
}
     return (0);
}


int SegPagt(int snint pnint pd)
{
int iwd;

sp.pl=256;
for(i=0;i<255;i++)
{
sp.pf[i]=sp.segf[i]=rand()%26624;//定义随机产生的数在1到26624之间
sp.ptl[i]=sp.segl[i]=rand()%512;//定义随机产生的数在1到512之间
sp.pt[i]=rand()%256;//定义随机产生的数在1到256之间
}
if(sn>256) printf(“段号%d大于段表长度256越界中断\n\n“sn);//如果段号大于段表长度256输出越界中断
else if(pn>sp.ptl[pn]) printf(“页号%d大于页表长度%d越界中断\n“pnsp.ptl[pn]);//如果页号大于页表长度输出越界中断
else if(pd>sp.pl) prin

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4035  2008-06-10 12:38  三种存储管理方式的地址换算过程\play.c

     目录          0  2008-06-07 19:44  三种存储管理方式的地址换算过程

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

                 4035                    2


评论

共有 条评论

相关资源