⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 模拟段页式地址转换.cpp

📁 模拟操作系统中
💻 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 + -