Раздел 2. Программная реализация основных элементов процессора

#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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: