Структура микропроцессора (на примере Е97).




Шаблоны классов.

По мере того как количество создаваемых вами классов растет, вы обнаруживаете, что некоторый класс, созданный для одной программы (или, возможно, для этой), очень похож на требующийся вам сейчас. Во многих случаях классы могут отличаться только типами. Другими словами, один класс работает с целочисленными значениями, в то время как требующийся вам сейчас должен работать со значениями типа float. Чтобы увеличить вероятность повторного использования существующего кода, C++ позволяет вашим программам определять шаблоны классов. Если сформулировать кратко, то шаблон класса определяет типонезависимый класс, который в дальнейшем служит для создания объектов требуемых типов. Если компилятор C++ встречает объявление объекта, основанное на шаблоне класса, то для построения класса требуемого типа он будет использовать типы, указанные при объявлении. Позволяя быстро создавать классы, отличающиеся только типом, шаблоны классов сокращают объем программирования, что, в свою очередь, экономит ваше время.

Теперь предположим, что вашей программе необходимо работать с массивом значений с плавающей точкой, кроме того, что она работает с целочисленным массивом. Один из способов обеспечить поддержку массивов различных типов состоит в создании разных классов. С другой стороны, используя шаблоны классов, вы можете избавиться от необходимости дублировать классы. Ниже представлен шаблон класса, который создает общий класс array:

template<class T, class T1> class array

{
public:
array(int size);
T1 sum (void);
T average_value(void);
void show_array(void);
int add_value(T);
private:
T *data;
int size;
int index;
};

 

По умолчанию, все функции и переменные, объявленные в классе, становятся закрытыми (private). Т.е. они доступны только из других членов этого класса. Для объявления открытых членов класса используется ключевое слово public. Все функции-методы и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс.

Этот шаблон определяет символы типов T и T1. В случае массива целочисленных значений Т будет соответствовать int, а T1 — long. Аналогичным образом для массива значений с плавающей точкой значения Т и Т1 равны float. Теперь потратьте время, чтобы убедиться, что вы поняли, как компилятор С++ будет подставлять указанные вами типы вместо символов Т и Т1.

Далее, перед каждой функцией класса вы должны указать такую же запись со словом template. Кроме того, сразу же после имени класса вы должны указать типы класса, например array <T, T1>::average_value. Следующий оператор иллюстрирует определение функции average_value для этого класса:

template<class Т, class T1> Т array<T, T1>::average_value(void)

{
T1 sum = 0;
int i;
for (i = 0; i < index; i++) sum += data[i];
return (sum / index);
}

После создания шаблона вы можете создавать класс требуемого типа, указывая имя класса, а за ним в угловых скобках необходимые типы, как показано ниже:

Имя шаблона //----> array <int, long> numbers (100); <------//Типы шаблона
array <float, float> values(200);

 

 

Структура микропроцессора (на примере Е97).

Главным блоком компьютера служит 16-разрядный процессор "Е97", способный работать как с двухбайтовыми словами, так и с отдельными байтами. Впервые в рамках учебной модели реализована возможность оперировать с данными разной длины. Познакомившись с тем, как "Е97" обрабатывает разные типы информации, читатель легко сможет в будущем обобщить логику "один байт или много" на случай большей разрядности процессора. В процессоре имеются внутренние регистры памяти, при помощи которых реализован метод косвенной адресации к ОЗУ. Очевидно, что полное 16-разрядное адресное пространство "Е97" позволяет напрямую адресовать до 64 Кбайт памяти; для учебной ЭВМ это более чем достаточно.

Процессор содержит программно доступные регистры: четыре регистра общего назначения (R0-R3), указатель стека (SP — stack pointer); служебные регистры: счетчик адреса команд (PC — programm counter), регистр состояния процессора (PS); и программно недоступные (внутренние), которые процессор использует в своих целях: регистр команд (РК), регистры операндов (Рг1, Рг2) и сумматор (См).

Счетчик адреса команд PC при работе программы всегда указывает на адрес очередной команды, выполняя которую, автоматически изменяется согласно основному алгоритму работы процессора. Регистры общего назначения можно рассматривать как внутреннюю память процессора. Они используются для промежуточного сохранения данных и адресов данных.

Указатель стека SP чаще всего используется при организации подпрограмм.

Регистр словосостояния (точнее говоря, отдельные его биты) анализируются при организации переходов, прерываний и т.д. Реально мы будем использовать только два бита: Z и N. Значения этих битов при возможных значениях результатов операций указаны ниже в таблице.

 

Результат Значение бита Z Результат Значение бита N
Нулевой (=0)   Отрицательный (<0)  
Ненулевой (≠ 0)   Неотрицательный (>= 0)  

 

При работе программы в регистр команд считывается очередная команда для дешифрования и дальнейшего выполнения; в регистры операндов считываются согласно выполняемой команде операнды из регистров общего назначения или из оперативной памяти; в сумматоре выполняется действие, и сохраняется его результат до тех пор, пока не будет выполнено следующее действие. Последние четыре регистра доступны лишь для наблюдения, их содержимое программист изменить не может (в отличие от программно доступных).

Минимальной адресуемой ячейкой памяти в микрокомпьютере E97, как и в любой современной персональной ЭВМ, является байт. Номера байтов (адреса) лежат в диапазоне от 0000(16) до FFFF(16). Гораздо чаще приходится работать с машинными словами (в E97 они двухбайтовые — напомним, что это связано с разрядностью процессора). Адрес машинного слова совпадает с номером младшего байта, входящего в слово, поэтому адреса всех машинных слов четные.

Для размещения программы и данных в распоряжении программиста ОЗУ (с адреса 0000 до адреса 00FE включительно). Программа и данные записываются в память E97 (в том числе и в регистры) в шестнадцатеричном коде. При этом целые числа задаются в дополнительном коде.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: