1. 程式人生 > >C語言作業系統——頁式地址變換(邏輯地址轉為實體地址)

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();

}

瀟小白的執行結果如下哦:


如果有什麼覺得可以改善的地方歡迎私信和我一起討論哦,讓我們一起進步,成長在路上!奮鬥