- •Пояснительная записка
- •1.4.2. Диапазон и погрешность представления чисел
- •1.4.3. Форматы команд, данных и слова состояния процессора
- •1.4.4. Организация виртуальной памяти
- •1.4.5. Способы организации ввода-вывода информации
- •1.4.6. Способ оценки производительности эвм
- •1.4.7. Приращение производительности эвм
- •2.2. Функциональная модель эвм
- •2.3. Алгоритм функционирования эвм
- •2.4. Средства управления прерываниями
- •2.5. Организация виртуальной памяти
- •Алгоритм работы виртуальной памяти
- •2.6. Оценка производительности эвм
- •3. Модификация созданной эвм
- •3.1. Возможности повышения производительности эвм
- •3.2. Организация конвейерной обработки команд
- •3.3. Расчет прироста производительности эвм
- •4. Тестовая задача
- •4.1. Алгоритм и программа для тестирования эвм
- •4.2. Моделирование процесса выполнения программы
- •5. Программирование ввода и вывода
- •5.1. Пример использования системных функций для ввода
- •5.2. Общие сведения об интерфейсе Win32 api
4.2. Моделирование процесса выполнения программы
Моделирование заключается в описании последовательности микроопераций, выполняемых функциональными блоками ЭВМ при интерпретации инструкций (команд) ЭВМ, составляющих объектную программу, и результатов, получаемых с помощью этих микроопераций. Для выбора очередной выполняемой микрооперации в алгоритме функционирования ЭВМ служат операторы проверки признаков, характеризующих результат действия микроопераций. При моделировании необходимо также описать конкретные значения указанных признаков, используемых в процессе интерпретации команды. Моделированию подвергаются следующие команд: ADD, Read.
ADD #4
Пусть (Akk(504)←Akk(500)+4(из адресной части)):
Проверка Тп. Тп=1.
Проверка условия INTR=1. Прерывание не произошло INTR=0.
Выборка очередной команды из основной памяти
Запись адреса текущей инструкции в регистр адреса (RA←IP=114)
Ожидание готовности памяти (проверка условия ReadyRam=1)
Копирование инструкции из регистра RD →RI
00001
10
000000000000000000000100
Проверка кода операции (≠00000). Код выбранной операции соответствует коду операции ADD (00001)
Выполнение арифметической операции
Вычисление исполнительного адреса операнда. Способ адресации –непосредственная (10)
В Акк уже хранится значение (500)
Перемещаем операнд (4- из адресной части) (т. к. СА=10) RD в R0
Выполнение арифметической операции
Пуск ALU
Ожидание готовности памяти (проверка условия ReadyRam=1)
Увеличение указателя текущей команды IP=114+4=118
Проверка условия ОVR (если OVR=1, то Тп=1, иначе Тп=0)
Возврат в начало цикла.
Read [Rk]
Пусть (Akk←Ram(Rk))
Проверка Тп. Тп=1.
Проверка условия INTR=1. Прерывание не произошло INTR=0.
Выборка очередной команды из основной памяти
Запись адреса текущей инструкции в регистр адреса (RA←IP=104)
Ожидание готовности памяти (проверка условия ReadyRam=1)
Копирование инструкции из регистра RD →RI
00100
11
000000000000011000001100
Проверка кода операции (≠00000). Код выбранной операции соответствует коду операции Read (00100)
Вычисление исполнительного адреса операнда в основной памяти. Способ адресации –косвенная (11)
Перемещаем операнд из памяти, т. к. СА=11
Включение режима чтения из памяти (RD RAM режим=1)
Инициализация ячейки памяти (адрес=400)
Ожидание готовности памяти (проверка условия ReadyRam=1)
Перемещаем операнд (1) из RD →Акк
Увеличение указателя текущей команды IP=104+4=108
Возврат в начало цикла (Тп=1).
5. Программирование ввода и вывода
5.1. Пример использования системных функций для ввода
Пусть требуется осуществить циклический вывод на экран символа "*". В теле цикла необходимо использовать функцию 07 прерывания DOS, обеспечить возможность перемещения положения курсора при нажатии соответствующей клавиши (вверх ↑, вниз ↓, вправо →, влево ←) и обеспечить возможность перемещения курсора на ограниченной плоскости экрана. Выход из цикла и завершение программы осуществляется при нажатии клавиши ESC.
# include <dos.h>
# include <conio.h>
# include <stdio.h>
# define ESC 27
void main(void) {//объявление простых и структурных переменных
int x=10, y=20; //начальное положение курсора
union REGS in, out; //Далее описывается основной цикл программы, прекращаемый при нажатии ESC.
do
{ gotoXY(x,y);
printf ("*\n");
in.h.ah=0x07;
int86(0x21, &in, &out);
if (out.h.al)= =0)
{//повторный вызов
in.h.ah=0x07;
int86(0x21, &in, &out);
}
switch (out.h.al) // анализ ситуаций
{
case 77: if (x>30) {x=10; y++;}
else if ((x==30) && (y==40)) {x=10; y=20;}
else x++; break;
case 75: if (x<10) {x=30; y--;}
else if ((x==10) && (y==20)) {x=30; y=40;}
else x--; break;
case 80: if (y>40) {y=20; x++;}
else if ((y==40) && (y==30)) {x=10; y=20;}
else y++; break;
case 72: if (y<20) {y=40; x--;}
else if ((y==20) && (x==10)) {x=30; y=40;}
else y--; break;
}
delay(500); //оператор задержки
}
while(out.h.al!=ESC);
}//конец программы.
Данная программа демонстрирует взаимодействие клавиатуры с СРU с помощью системы прерываний. В программе пользователя осуществляется обращение к клавиатуре с помощью функций BIOS, DOS или функций языка высокого уровня (С, Pascal).
Для вызова функции DOS используется регистр АН, содержащий номер функции, и команда INT 21H. Результат выполнения функции DOS размещается в AL. В DOS каждая функция характеризуется тремя признаками:
Функция либо ожидает ввода символа в буфер, либо сразу выдает сообщение о том, что буфер пуст;
Функция либо выполняет эхо-печать, либо эхо-печать отсутствует;
Функция либо может быть прерванной другими функциями, например, 1BH, 23H (Ctrl_Break), либо нет.