#include <stdlib.h>
#include <stdio.h>
int page(int A,int L );
int Segment(int sn,int sl);
int SegPagt(int sn,int pn,int 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 pl,pa,sn,sd,pd,pn;
//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(pa,pl);
}break;
case 2:{
printf("请演示设定段表长度小于256\n");
printf("请输入逻辑地址的段号:\n");
scanf("%d",&sn);
printf("段内地址:\n");
scanf("%d",&sd);
Segment(sn,sd);
}break;
case 3:{
printf("预设定段表长为256,页面大小为256\n");
printf("请输入逻辑地址的段号:\n");
scanf("%d",&sn);
printf("页号:\n");
scanf("%d",&pn);
printf("页内地址:\n");
scanf("%d",&pd);
SegPagt(sn,pn,pd);
}break;
case 4:{}break;
}
}while (code<4);
}
int page(int A,int L)
{
int d,P,kd,i;
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",P,d);//输出页号和页内地址
kd=PT[P];//根据页号随机产生快号
printf("根据页号%d得到块号%d\n",P,kd);
WD=kd*L+d;//计算物理地址的公式
printf("物理地址=块号%d*页面大小%d+页内地址%d\n",kd,L,d);//输出物理地址=块号*页面大小+页内地址
printf("逻辑地址%d换算后的物理地址为%d\n\n",A,WD);//输出物理地址的结果
return (0);
}
}
int Segment(int sn,int sd)
{
int i,wd;
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",sd,st.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 sn,int pn,int pd)
{
int i,wd;
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",pn,sp.ptl[pn]);//如果页号大于页表长度,输出越界中断
else if(pd>sp.pl) printf("页内地址%d大于页面长度%d,中断\n",pd,sp.pl);//如果页内地址大于页面长度,输出中断
else{
printf("通过段号%d找到页表首地址%d\n通过页号%d找到块号%d\n",sn,sp.pf[sn],pn,sp.pt[pn]);//输出页表首地址和块号
printf("物理地址=页表首地址%d+快号%d*页面长度%d+页内地址%d\n",sp.pf[sn],sp.pt[pn],sp.pl,pd);//输出物理地址=页表首地址+快号*页面长度+页内地址
wd=sp.pf[sn]+sp.pt[pn]*sp.pl+pd;//计算物理地址的公式
printf("物理地址为:%d\n\n",wd);//输出物理地址的最好结果
}return (0);
}
三种存储管理方式的地址换算过程
5星 · 超过95%的资源 需积分: 10 183 浏览量
2008-06-17
22:13:37
上传
评论 7
收藏 2KB RAR 举报
ojm6250
- 粉丝: 0
- 资源: 1
最新资源
- J211-T1B-A-VB一款SOT23封装P-Channel场效应MOS管
- J210-VB一款SOT23封装P-Channel场效应MOS管
- content_1713924059748.zip
- J210-T1B-A-VB一款SOT23封装P-Channel场效应MOS管
- Suno V3 AI音乐生成神器,助你秒变音乐大师,suno AI音乐使用教程
- 自适应极化滤波完成P/S波分离
- 0b40adff-950d-44cf-88e6-f4a64292b638.apk
- J209-VB一款SOT23封装P-Channel场效应MOS管
- OLED12864模块(IIC接口)中文说明书.pdf
- 22304010116工管余文贤.bak
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈