?? play.c
字號(hào):
#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.結(jié)束運(yùn)行\(zhòng)n\n");
printf("----------------------------------------------------------\n");
printf("請(qǐng)輸入您的選擇:");
scanf("%d",&code);
switch(code)
{
case 1:{
printf("注意:請(qǐng)演示設(shè)定頁表長度小于256\n");
printf("請(qǐng)輸入換算的邏輯地址:\n");
scanf("%d",&pa);
printf("頁面大小(B):\n");
scanf("%d",&pl);
page(pa,pl);
}break;
case 2:{
printf("請(qǐng)演示設(shè)定段表長度小于256\n");
printf("請(qǐng)輸入邏輯地址的段號(hào):\n");
scanf("%d",&sn);
printf("段內(nèi)地址:\n");
scanf("%d",&sd);
Segment(sn,sd);
}break;
case 3:{
printf("預(yù)設(shè)定段表長為256,頁面大小為256\n");
printf("請(qǐng)輸入邏輯地址的段號(hào):\n");
scanf("%d",&sn);
printf("頁號(hào):\n");
scanf("%d",&pn);
printf("頁內(nèi)地址:\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;//定義隨機(jī)產(chǎn)生的快號(hào)在1到512之間
}
P=A/L;//頁號(hào)等于邏輯地址/頁面大小
d=A%L;//頁內(nèi)地址=邏輯地址%頁面大小
if(P>L) printf("頁號(hào)大于頁表長度,越界中斷\n\n");//如果頁號(hào)大于頁表長度,輸出越界中段
else {
printf("頁號(hào)=邏輯地址/頁面大小=%d,頁內(nèi)地址=邏輯地址%頁面大小=%d\n",P,d);//輸出頁號(hào)和頁內(nèi)地址
kd=PT[P];//根據(jù)頁號(hào)隨機(jī)產(chǎn)生快號(hào)
printf("根據(jù)頁號(hào)%d得到塊號(hào)%d\n",P,kd);
WD=kd*L+d;//計(jì)算物理地址的公式
printf("物理地址=塊號(hào)%d*頁面大小%d+頁內(nèi)地址%d\n",kd,L,d);//輸出物理地址=塊號(hào)*頁面大小+頁內(nèi)地址
printf("邏輯地址%d換算后的物理地址為%d\n\n",A,WD);//輸出物理地址的結(jié)果
return (0);
}
}
int Segment(int sn,int sd)
{
int i,wd;
for(i=0;i<255;i++)
{
st.segf[i]=rand()%255;//定義隨機(jī)產(chǎn)生段首地址為1到255之間
st.segl[i]=rand()%2048;//定義隨機(jī)產(chǎn)生段長度為1到2048之間
}
if(sn>256) printf("段號(hào)%d大于段表長度256,越界中斷\n\n",sn);//如果段號(hào)大于段表長度,輸出越界中斷
else if(sd>st.segl[sn]) printf("段內(nèi)地址%d大于段長度%d,越界中斷\n",sd,st.segl[sn]);//如果段內(nèi)地址大于段長度,輸出越界中斷
else{
printf("根據(jù)段號(hào)找到段首地址%d\n",st.segf[sn]);
printf("物理地址=段首地址%d+段內(nèi)地址%d\n",st.segf[sn],sd); //輸出物理地址=段首地址+段內(nèi)地址
wd=st.segf[sn]+sd;//計(jì)算物理地址的算法
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;//定義隨機(jī)產(chǎn)生的數(shù)在1到26624之間
sp.ptl[i]=sp.segl[i]=rand()%512;//定義隨機(jī)產(chǎn)生的數(shù)在1到512之間
sp.pt[i]=rand()%256;//定義隨機(jī)產(chǎn)生的數(shù)在1到256之間
}
if(sn>256) printf("段號(hào)%d大于段表長度256,越界中斷\n\n",sn);//如果段號(hào)大于段表長度256,輸出越界中斷
else if(pn>sp.ptl[pn]) printf("頁號(hào)%d大于頁表長度%d,越界中斷\n",pn,sp.ptl[pn]);//如果頁號(hào)大于頁表長度,輸出越界中斷
else if(pd>sp.pl) printf("頁內(nèi)地址%d大于頁面長度%d,中斷\n",pd,sp.pl);//如果頁內(nèi)地址大于頁面長度,輸出中斷
else{
printf("通過段號(hào)%d找到頁表首地址%d\n通過頁號(hào)%d找到塊號(hào)%d\n",sn,sp.pf[sn],pn,sp.pt[pn]);//輸出頁表首地址和塊號(hào)
printf("物理地址=頁表首地址%d+快號(hào)%d*頁面長度%d+頁內(nèi)地址%d\n",sp.pf[sn],sp.pt[pn],sp.pl,pd);//輸出物理地址=頁表首地址+快號(hào)*頁面長度+頁內(nèi)地址
wd=sp.pf[sn]+sp.pt[pn]*sp.pl+pd;//計(jì)算物理地址的公式
printf("物理地址為:%d\n\n",wd);//輸出物理地址的最好結(jié)果
}return (0);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -