C语言操作系统——页式地址变换(逻辑地址转为物理地址)

本次代码分享较为简单,主要是二进制与十六进制之间的转换。还是一个工程文件中包含一个头文件和一个功能文件和主函数文件,潇小白在这里就不再次介绍啦!大笑

代码如下:

头文件,pag_trans.h

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>


void transform();

功能文件,pag_trans.cpp

#include "pag_trans.h"
#define MAX 50


void transform()
{
int elem2[MAX];
char elem16[MAX];
int elem[MAX];
printf("请输入逻辑地址(十六进制数),并以'#'结束:\n");
int flag=1;
char ch;
int i=0;
while(flag)
{
scanf("%c",&ch);
if(ch!='#'&& ch!='\n')
{
elem16[i]=ch;
i++;
}
else if(ch=='#')
flag=0;
}
int length1=i;//输入字符数
int length2=0;//记录最后传入elem2中的有几个数
int n=0;
int sum=0;
for(n=0;n<length1;n++)//判断是否是十六进制数
{
int x=(int)elem16[n];
if((x>=48 && x<=57)||(x>=65 && x<=70)||(x>=97 && x<=102))
sum++;
}
if(sum == length1)//是十六进制数
{
int j=0;//用于数组下标
int number=0;//转换的十进制数
int k=0;// 用于记录单个字符装换的次数,每次循环置0
int p=0;
int m=0;//数组下标
int cout=3;//记录位数为4位
for(j=0;j<length1;j++)
{
m=cout;//m的初值为3
int x=(int)elem16[j];
if(x>=48 && x<=57)//先转为十进制数
{
number=elem16[j]-48;
}
else if(x>=65 && x<=70)
{
number=elem16[j]-55;
}
else if(x>=97 && x<=102)
{
number=elem16[j]-87;
}
if(number!=1 && number!=0)
{
do//十进制数转换为二进制数
{
elem2[m]=number % 2;
number=number/2;
length2++;
k++;
m--;
}while(number>1);
if(k==3)//循环三次,即输入的字符大于等于8
{
elem2[m]=1;
length2++;
//m--;
}
else
{
elem2[m]=1;
//if(m==2||m==6||m==10||m==14)//判别0时用到
//elem2[m]=0;
m--;
length2++;
for(p=0;p<3-k;p++)//保证每个字符循环4次
{
elem2[m]=0;
length2++;
m--;
}
}
k=0;
}
else if(number==1)
{
elem2[m]=1;
m--;
length2++;
for(p=0;p<3;p++)
{
elem2[m]=0;
length2++;
m--;
}
}
else if(number==0)
{
elem2[m]=0;
m--;
length2++;
for(p=0;p<3;p++)
{
elem2[m]=0;
length2++;
m--;
}
}
cout=cout+4;//将每个十进制数转换成4位二进制数,第二个字符比第一个字符加4,每个字符从低位向高位循环
}
}
else
{
printf("输入的不是十六进制数!\n");
}
printf("逻辑地址的二进制数为:\n");
if(length2==16)
{
for(i=0;i<length2;i++)
{
printf("%d",elem2[i]);
if((i+1)%4==0)
printf(" ");
}
}
else if(length2<16)//补位
{
for(i=0;i<16-length2;i++)
{
int a=i;
if(i<length2)//确保只取有效位数
elem[a]=elem2[i];
elem2[i]=0;
printf("%d",elem2[i]);
if((i+1)%4==0)
printf(" ");
}
if(length2>=8)
{
for(i=16-length2;i<16;i++)
{
int a=i;
elem[a]=elem2[i];
}
}
for(i=16-length2;i<16;i++)
{
elem2[i]=elem[i-16+length2];
printf("%d",elem2[i]);
if((i+1)%4==0)
printf(" ");
}
}
printf("\n");
//逻辑地址与物理地址的转换
double b=0;//页号
int c=0;//块号
int temp[MAX];
int count=3;
b=elem2[3]*pow(2,0)+elem2[2]*pow(2,1)+elem2[1]*pow(2,2)+elem2[0]*pow(2,3);
if(b>5)
{
printf("页号大小超过页表长度!\n");
}
if(b==0)
{
c=2;
do
{
temp[count]=c%2;
elem2[count]=temp[count];
c=c/2;
count--;
}while(c!=0);
}
if(b==1)
{
c=3;
do
{
temp[count]=c%2;
elem2[count]=temp[count];
c=c/2;
count--;
}while(c!=0);
}
if(b==2)
{
c=6;
do
{
temp[count]=c%2;
elem2[count]=temp[count];
c=c/2;
count--;
}while(c!=0);
}
if(b==3)
{
c=8;
do
{
temp[count]=c%2;
elem2[count]=temp[count];
c=c/2;
count--;
}while(c!=0);
}
if(b==4)
{
c=9;
do
{
temp[count]=c%2;
elem2[count]=temp[count];
c=c/2;
count--;
}while(c!=0);
}
if(b==5)
{
c=12;
do
{
temp[count]=c%2;
elem2[count]=temp[count];
c=c/2;
count--;
}while(c!=0);
}
if(b<=5)
{
printf("转换的物理地址的二进制数为:\n");
for(i=0;i<16;i++)
{
printf("%d",elem2[i]);
if((i+1)%4==0)
printf(" ");
}
printf("\n");
printf("物理地址的十六进制数为:\n");
int data[MAX];
char h;
data[0]=(int)elem2[3]*pow(2,0)+elem2[2]*pow(2,1)+elem2[1]*pow(2,2)+elem2[0]*pow(2,3);
/* data[1]=(int)elem2[7]*pow(2,0)+elem2[6]*pow(2,1)+elem2[5]*pow(2,2)+elem2[4]*pow(2,3);
data[2]=(int)elem2[11]*pow(2,0)+elem2[10]*pow(2,1)+elem2[9]*pow(2,2)+elem2[8]*pow(2,3);
data[3]=(int)elem2[15]*pow(2,0)+elem2[14]*pow(2,1)+elem2[13]*pow(2,2)+elem2[12]*pow(2,3);
printf("%d %d %d %d",data[0],data[1],data[2],data[3]);*/
if(data[0]>9)
{
if(data[0]==10)
h='a';
if(data[0]==11)
h='b';
if(data[0]==12)
h='c';
if(data[0]==13)
h='d';
if(data[0]==14)
h='e';
if(data[0]==15)
h='f';
printf("%c",h);
}
if(data[0]<=9)
printf("%d",data[0]);
for(i=1;i<4;i++)
{
printf("%c",elem16[i]);
}
printf("\n");
}
}

主函数文件,pag_trans_test.cpp

#include "pag_trans.h"


void main()
{
printf("_________基本分页式地址变换_________\n\n");
printf("页表如下:\n");
printf("============\n");
printf("页号    块号\n");
printf("0\t2\n1\t3\n2\t6\n3\t8\n4\t9\n5\t12\n");
printf("============\n\n");
printf("页面结构如下:\n");
printf("==================================\n");
printf("15\t    11\t\t\t0\n");
printf("_________________________________\n");
printf("|页号(4位)|位移量(12位)\t|\n");
printf("---------------------------------\n");
transform();

}


潇小白的运行结果如下哦:


如果有什么觉得可以改善的地方欢迎私信和我一起讨论哦,让我们一起进步,成长在路上!奋斗


猜你喜欢

转载自blog.csdn.net/wu_zx520/article/details/80560678