📄 模拟段页式地址转换.cpp
字号:
//设定每个页面大小为1KB.
//共5个段号,需要3个二进制位。各个页表最多6个页号,需要3个二进制位。
//每个页面1KB需要10个二进制位。则逻辑地址用16位二进制或者4位十六进制表示。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <string>
#include <cctype>
#include <vector>
#include <cmath>
using namespace std;
//------段号------------0----------1---------2----------3----------4-----
int DuanBiao[5][3]={{0,3,1024},{1,5,1028},{2,6,1034},{3,4,1038},{4,5,1044}
};
//---------------构造段表-------------------------------------------------
//------页号------0-------1-------2--------3--------4--------5------------
int YeB0[3][2]={{0,6}, {1,3}, {2,5} //0号页表
};
int YeB1[5][2]={{0,2}, {1,16}, {2,10}, {3,17}, {4,8} //1号页表
};
int YeB2[6][2]={{0,11}, {1,7}, {2,18}, {3,4}, {4,13}, {5,15} //2号页表
};
int YeB3[4][2]={{0,25}, {1,14}, {2,22}, {3,24} //3号页表
};
int YeB4[5][2]={{0,23}, {1,9}, {2,19}, {3,21}, {4,20} //4号页表
};
//---构造各段表对应的页表、页表对应数据块占据从2~26KB之间的内存单元------
void checkInput(string& DHao,string& YHao,string& WYi,string logicAddress);
void changeAddress(string& DHao,string& YHao,string& WYi);
string HBswit(string HBchange);
string BHswit(string BHchange);
int main()
{
char ans;
ofstream outStream;
outStream.open("outfile.txt");
if (outStream.fail()) {
cout<<"Having not open outfile.txt!"<<endl;
exit(0);
}
outStream<<"段表:"<<endl;
outStream<<"段号 页表长度 页表首地址"<<endl;
for (int i=0;i<5;i++) {
/*
switch(i) {
case 0:outStream<<"(000)"<<' '; break;
case 1:outStream<<"(001)"<<' '; break;
case 2:outStream<<"(010)"<<' '; break;
case 3:outStream<<"(011)"<<' '; break;
case 4:outStream<<"(100)"<<' '; break;
}
*/
for (int j=0;j<3;j++) {
outStream<<DuanBiao[i][j]<<" ";
}
outStream<<endl;
}
outStream<<endl;
outStream<<"首地址:"<<DuanBiao[0][2]<<" 页表0:"<<endl;
outStream<<"页号 块号"<<endl;
for (int a=0;a<3;a++) {
for (int b=0;b<2;b++) {
outStream<<YeB0[a][b]<<" ";
}
outStream<<endl;
}
outStream<<"首地址:"<<DuanBiao[1][2]<<" 页表1:"<<endl;
outStream<<"页号 块号"<<endl;
for (int c=0;c<5;c++) {
for (int d=0;d<2;d++) {
outStream<<YeB1[c][d]<<" ";
}
outStream<<endl;
}
outStream<<"首地址:"<<DuanBiao[2][2]<<" 页表2:"<<endl;
outStream<<"页号 块号"<<endl;
for (int e=0;e<6;e++) {
for (int f=0;f<2;f++) {
outStream<<YeB2[e][f]<<" ";
}
outStream<<endl;
}
outStream<<"首地址:"<<DuanBiao[3][2]<<" 页表3:"<<endl;;
outStream<<"页号 块号"<<endl;
for (int g=0;g<4;g++) {
for (int h=0;h<2;h++) {
outStream<<YeB3[g][h]<<" ";
}
outStream<<endl;
}
outStream<<"首地址:"<<DuanBiao[4][2]<<" 页表4:"<<endl;
outStream<<"页号 块号"<<endl;
for (int m=0;m<5;m++) {
for (int n=0;n<2;n++) {
outStream<<YeB4[m][n]<<" ";
}
outStream<<endl;
}
cout<<"注:"<<endl;
cout<<"3位表示段号、3位表示页号、10位表示页内位移。共16位二进制逻辑地址!"<<endl;
cout<<"二进制逻辑地址16位并以B(b)结束,十六进制4位以H(h)结束。否则将提示错误!"<<endl;
string D_hao,Y_hao,YNweiyi;
string volues;
do {
cout<<"请输入逻辑地址:";
cin>>volues;
checkInput(D_hao,Y_hao,YNweiyi,volues);
changeAddress(D_hao,Y_hao,YNweiyi);
cout<<"Again?(y/n):";
cin>>ans;
}while(ans=='y'||ans=='Y');
return 0;
}
void checkInput(string& DHao,string& YHao,string& WYi,string logicAddress)
{
if((logicAddress.length()==5||logicAddress.length()==17)
&&(logicAddress[4]=='H'||logicAddress[16]=='B'
||logicAddress[4]=='h'||logicAddress[16]=='b')){
if (logicAddress.length()==5) {
logicAddress=HBswit(logicAddress);
}
}
else{
cout<<"输入错误!!!"<<endl;
exit(0);
}
DHao=logicAddress.substr(0,3);
YHao=logicAddress.substr(3,3);
WYi=logicAddress.substr(6,10);
}
void changeAddress(string& DHao,string& YHao,string& WYi)
{
vector<int>TwoNum;
string DbCh;
char SChar[10];
int YLoc;
int DD,YY;
if(DHao=="000") DD=0;else
if(DHao=="001") DD=1;else
if(DHao=="010") DD=2;else
if(DHao=="011") DD=3;else
if(DHao=="100") DD=4;else
if(DHao=="101") DD=5;else
if(DHao=="110") DD=6;else
if(DHao=="111") DD=7;else
DD=-1;
if(YHao=="000") YY=0;else
if(YHao=="001") YY=1;else
if(YHao=="010") YY=2;else
if(YHao=="011") YY=3;else
if(YHao=="100") YY=4;else
if(YHao=="101") YY=5;else
if(YHao=="110") YY=6;else
if(YHao=="111") YY=7;else
YY=-1;
if (DD==-1||YY==-1) {
cout<<"输入错误,请检查!!!"<<endl;
exit(0);
}
cout<<"段号 "<<"页号 "<<"页内位移"<<endl;
cout<<DHao<<" "<<YHao<<" "<<WYi<<endl;
if(DD>4){
cout<<"段号越界!!!"<<endl;
exit(0);
}
if (DuanBiao[DD][1]<YY) {
cout<<"指定段中无该页!!!"<<endl;
exit(0);
}
switch(DD) {
case 0: YLoc=YeB0[YY][1];break;
case 1: YLoc=YeB1[YY][1];break;
case 2: YLoc=YeB2[YY][1];break;
case 3: YLoc=YeB3[YY][1];break;
case 4: YLoc=YeB4[YY][1];break;
default:
exit(0);
}
itoa(YLoc,SChar,2);
DbCh=SChar+WYi;
if (DbCh.length()==15) {
DbCh="0"+DbCh;
}else
if (DbCh.length()==14) {
DbCh="00"+DbCh;
}else
if (DbCh.length()==13) {
DbCh="000"+DbCh;
}else
if (DbCh.length()==12) {
DbCh="0000"+DbCh;
}
cout<<"物理地址为:"<<endl;
cout<<DbCh.substr(0,4)<<' '<<DbCh.substr(4,4)<<' '
<<DbCh.substr(8,4)<<' '<<DbCh.substr(12,4)<<'B'<<endl;
cout<<BHswit(DbCh.substr(0,4))<<BHswit(DbCh.substr(4,4))
<<BHswit(DbCh.substr(8,4))<<BHswit(DbCh.substr(12,4))<<'H'<<endl;
}
string HBswit(string HBchange)
{
string sssss;
for (int index=0;index<HBchange.length()-1;index++) {
switch(HBchange[index]) {
case '0':sssss=sssss+"0000";break;
case '1':sssss=sssss+"0001";break;
case '2':sssss=sssss+"0010";break;
case '3':sssss=sssss+"0011";break;
case '4':sssss=sssss+"0100";break;
case '5':sssss=sssss+"0101";break;
case '6':sssss=sssss+"0110";break;
case '7':sssss=sssss+"0111";break;
case '8':sssss=sssss+"1000";break;
case '9':sssss=sssss+"1001";break;
case 'A':sssss=sssss+"1010";break;
case 'B':sssss=sssss+"1011";break;
case 'C':sssss=sssss+"1100";break;
case 'D':sssss=sssss+"1101";break;
case 'E':sssss=sssss+"1110";break;
case 'F':sssss=sssss+"1111";break;
default:{
cout<<"输入错误,请检查!!!"<<endl;
exit(0);
}
}
}
return HBchange=sssss;
}
string BHswit(string BHchange)
{
if(BHchange=="0000") BHchange="0";else
if(BHchange=="0001") BHchange="1";else
if(BHchange=="0010") BHchange="2";else
if(BHchange=="0011") BHchange="3";else
if(BHchange=="0100") BHchange="4";else
if(BHchange=="0101") BHchange="5";else
if(BHchange=="0110") BHchange="6";else
if(BHchange=="0111") BHchange="7";else
if(BHchange=="1000") BHchange="8";else
if(BHchange=="1001") BHchange="9";else
if(BHchange=="1010") BHchange="A";else
if(BHchange=="1011") BHchange="B";else
if(BHchange=="1100") BHchange="C";else
if(BHchange=="1101") BHchange="D";else
if(BHchange=="1110") BHchange="E";else
if(BHchange=="1111") BHchange="F";
return BHchange;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -