?? 模擬段頁式地址轉換.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 + -