?? 演示地址換算.cpp
字號:
#include <stdlib.h>
#include <stdio.h>
int page(int A,int L);
int Segment(int sn,int sl);
int SegPag(int sn,int pn,int pd);
typedef struct segtable //模擬段表的結(jié)構(gòu)體
{
int segf[256];
int segl[256];
};
typedef struct segpagt
{
int segf[256];//分為256個段
int segl[256];//段長為256
int ptl[256];//頁表數(shù)為256
int pt[256];//每頁為256塊
int pf[256];//頁首地址數(shù)組
int pl;
};
void main()
{
int code;
int pl,pa,sn,sd,pd,pn;
printf("=====================================\n");//主菜單
printf(" 操作系統(tǒng)課程設(shè)計第九題\n");
printf("=====================================\n\n");
do{
printf(" 1.分頁式地址換算\n");
printf(" 2.分段式地址換算\n");
printf(" 3.段頁式地址換算\n");
printf(" 4.退出\n\n");
scanf("%d",&code);
switch(code)
{
case 1:{
printf("注意:本次演示設(shè)定頁表長度為256\n");
printf("請輸入換算的邏輯地址:\n");
scanf("%d",&pa);
printf("頁面大小(B):\n");
scanf("%d",&pl);
page(pa,pl);
}break;
case 2:{
printf("注意:本次演示設(shè)定段表長為256\n");
printf("請輸入邏輯地址的段號:\n");
scanf("%d",&sn);
printf("段內(nèi)地址:\n");
scanf("%d",&sd);
Segment(sn,sd);
}break;
case 3:{
printf("注意:本次演示設(shè)定段表長為256,頁面大小為256\n");
printf("請輸入邏輯地址的段號:\n");
scanf("%d",&sn);
printf("頁號:\n");
scanf("%d",&pn);
printf("頁內(nèi)地址:\n");
scanf("%d",&pd);
SegPag(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];//定義一個數(shù)組來模擬頁表
for(i=1;i<256;i++)//將256個0到512中的隨機數(shù)存入數(shù)組
{
PT[i]=rand() %512;
}
P=A/L;//求頁號,A/L取整
d=A%L;//求頁內(nèi)地址,A%L求余
if(P>256) printf("頁號大于頁表長度,越界中斷\n\n");//判斷是否越界
else {
printf("頁號為%d,頁內(nèi)地址為%d\n",P,d);
kd=PT[P];//根據(jù)頁號查找塊號
printf("根據(jù)頁號%d得到塊號%d\n",P,kd);
WD=kd*L+d;//求物理地址
printf("物理地址=塊號%d*頁面大小%d+頁內(nèi)地址%d\n",kd,L,d);
printf("邏輯地址%d換算后的物理地址為%d\n\n",A,WD);
return NULL;
}
}
//分段式地址換算
int Segment(int sn,int sd)
{
int i,wd;
segtable st;//定義段表ST
for(i=0;i<255;i++)//隨機產(chǎn)生段首地址和段長度
{
st.segf[i]=rand()%255;
st.segl[i]=rand()%2048;
}
if(sn>256) printf("段號%d大于段表長度256,越界中斷\n\n",sn);//判斷越界中斷
else if(sd>st.segl[sn]) printf("段內(nèi)地址%d大于段長度%d,越界中斷\n",sd,st.segl[sn]);
else{
printf("物理地址=段首地址%d+段內(nèi)地址%d\n",st.segf[sn],sd);
wd=st.segf[sn]+sd;//計算物理地址
printf("換算得到的物理地址為:%d\n\n",wd);
}
return NULL;
}
//段頁式地址換算
int SegPag(int sn,int pn,int pd)
{
int i,wd;
segpagt sp;
sp.pl=256;
for(i=0;i<255;i++)//隨機模擬段頁表
{
sp.pf[i]=sp.segf[i]=rand()%26624;
sp.ptl[i]=sp.segl[i]=rand()%512;
sp.pt[i]=rand()%256;
}
if(sn>256) printf("段號%d大于段表長度256,越界中斷\n\n",sn);//判斷越界中斷
else if(pn>sp.ptl[pn]) printf("頁號%d大于頁表長度%d,越界中斷\n",pn,sp.ptl[pn]);
else if(pd>sp.pl) printf("頁內(nèi)地址%d大于頁面長度%d,中斷\n",pd,sp.pl);
else{
wd=sp.pf[sn]+sp.pt[pn]*sp.pl+pd;//計算物理地址
printf("通過段號%d找到頁表首地址%d\n通過頁號%d找到塊號%d\n",sn,sp.pf[sn],pn,sp.pt[pn]);
printf("物理地址為:%d\n\n",wd);
}
return NULL;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -