#include <iostream>
#include <stdio.h>
using namespace std;
// объявление класса Processor
class Processor
{
public:
//память
// основная память 32 Кбайта 16 разрядный адрес
//32 Кбайта = 32768 байт. 16-разрядное число может хранить 65535 бит=8192 байта
// 32768/8192=4 байта - тип int
unsigned int *memory;
//количество и формат регистов
// 4х8 бит
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
// 12х16 бит
unsigned short int bit16[12];
// 2х32 бита
unsigned long int dv_a;
unsigned long int dv_b;
Processor()
{
memory = new unsigned int [8192];
a=0;
b=0;
c=0;
d=0;
for (int t=0; t<12; ++t) bit16[t]= t+2;
};
// АДРЕСАЦИЯ
//непосредственная адресация
void mov (unsigned char *reg, unsigned char num)
{
*reg=num;
};
//регистровая адресация
void mov (unsigned char *op1, unsigned char *op2)
{
*op1=*op2;
};
//индексная адресация
void mov (unsigned char *register1, unsigned char *register2, unsigned char adres)
{
char n= *register2 + adres; // адрес по которому находтся элемент
};
//НАБОР АППАРАТНО ИСПОЛНЯЕМЫХ КОМАНД
//сложение
void add (unsigned char *op1, unsigned char *op2)
{
*op1=*op1+*op2;
};
void add (unsigned char *op1,unsigned char num)
{
*op1=*op1+num;
};
//сдвиг влево, передаваемое число - количество разрядов сдвига
void ls (unsigned char *op1, unsigned char num)
|
|
{
*op1=*op1<<num;
};
//сдвиг вправо, передаваемое число - количество разрядов сдвига
void rs (unsigned char *op1, unsigned char num)
{
*op1=*op1>>num;
};
// инверсия
void neg (unsigned char *op1)
{
*op1=~*op1;
};
// деление
void div (unsigned char *op1, unsigned char *op2)
{
int num=0;
while (*op2>1)
{
*op2=*op2/2;
num++;
};
*op1=*op1>>num;
};
};
class Processor2
{
public:
//конвеер
int mem[32];
int buff;
int PC; //счетчик команд
int opertype;// тип команды
int buffop1; // оператор 1
int buffop2; // оператор 2
int stop;
Processor2()
{
PC=32;
opertype=0;
buff=0;
buffop1=0;
buffop2=0;
stop = 13;
};
// Блок 1, выборка команды, загрузка кода команды из памяти в регистр процессора
void Bloc1 ()
{
if (PC>stop)
{
buff=mem[PC]; // переменной buff присваивается mem[31]
PC=PC-3; // счетчик уменьшается на 3 (элемент 28, 25, 22,19,16)
Bloc2();
}
else
{
opertype = 3;
Bloc4();
}
};
//Блок 2, декодирование команды
void Bloc2()
{
if (buff==1) {opertype=1;} else {opertype=2;}
Bloc3();
};
// Блок 3, выборка операндов
void Bloc3()
{
buffop1 = mem[mem[PC-1]]; // ор1 = mem[30]
buffop2 = mem[mem[PC-2]]; // op2 = mem[29]
Bloc4();
};
// Блок 4, выполнение команды
void Bloc4()
{
switch(opertype)
{
case 1: buffop1 = buffop2; // если код операции 1 - адресация
break;
case 2: buffop1 = buffop1 + buffop2; // если код операции 2 - сложение
break;
default:
Bloc1();
break;
}
Bloc5 ();
};
//Блок 5, запись результата
void Bloc5()
{
mem[mem[PC-1]]=buffop1;
Bloc1();
};
};
int main ()
{
Processor proc1;
Processor2 proc2;
unsigned char *rega=&proc1.a;
unsigned char *regb=&proc1.b;
unsigned char *regc=&proc1.c;
unsigned char *regd=&proc1.d;
proc1.mov(rega,8);
proc1.mov(regb,2);
proc1.mov(regc,32);
proc1.mov(regd,rega);
// выполнение операции сложения содержимого регистров 'а' и 'b'
proc1.add(rega,regb);
// сдвиг на три регистра
proc1.ls(regb,3);
printf("ADD rega %d \n", *rega);
printf("LS regb %d \n", *regb);
// выполнение операции деления регистра с на d
proc1.div(regc,regd);
printf("\nDIV c/d: %d \n", *regc);
// предварительный вывод массива
|
|
cout << "\nPremier array\n";
for (int t=0; t<12;++t)
cout << proc1.bit16[t]<<" ";
cout << "\n";
// конвейер
proc2.mem[1]=1; proc2.mem[2]=2; proc2.mem[5]=5; proc2.mem[6]=6;
proc2.mem[7]=7; proc2.mem[8]=5; proc2.mem[9]=4; proc2.mem[10]=7;
proc2.mem[31]=1; proc2.mem[30]=5; proc2.mem[29]=8;
proc2.mem[28]=1; proc2.mem[27]=6; proc2.mem[26]=9;
proc2.mem[25]=1; proc2.mem[24]=7; proc2.mem[23]=10;
proc2.mem[22]=2; proc2.mem[21]=5; proc2.mem[20]=6;
proc2.mem[19]=2; proc2.mem[18]=6; proc2.mem[17]=7;
proc2.mem[16]=2; proc2.mem[15]=5; proc2.mem[14]=6;
proc2.Bloc1();
system ("pause");
return (0);
}
Заключение
В результате выполнения данной курсовой работы удалось создать простую и эффективную программу для работы процессора. При этом процессор может выполнять простейшие команды, такие как: сложение, сдвиг, инверсия, деление.
В ходе выполнения курсовой работы были изучены основные принципы работы процессора с памятью и регистрами, а также основные принципы и синтаксис программы на языке С++.
Список используемой литературы
1. Атрощенко, В. А. Курс лекций по информатике / В. А. Атрощенко. — Краснодар: Издательский Дом – Юг, 2009. — 252 с.
2. Информатика. Практикум: Учебное пособие: для студентов очной и заочной форм обучения / В. А. Атрощенко, Н. В. Василенко, Л. М. Крицкая и др. — Краснодар: Издательский Дом – Юг, 2009. — 230 с.
3. Архитектура компьютера, 6-е издание. Э. Таненбаум, Т. Остин, 810 с. Москва – 2013.