Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект по дисциплине Архитектура ЭВМ.doc
Скачиваний:
28
Добавлен:
01.05.2014
Размер:
661.5 Кб
Скачать

4.2. Моделирование процесса выполнения программы

Моделирование заключается в описании последовательности микроопераций, выполняемых функциональными блоками ЭВМ при интерпретации инструкций (команд) ЭВМ, составляющих объектную программу, и результатов, получаемых с помощью этих микроопераций. Для выбора очередной выполняемой микрооперации в алгоритме функционирования ЭВМ служат операторы проверки признаков, характеризующих результат действия микроопераций. При моделировании необходимо также описать конкретные значения указанных признаков, используемых в процессе интерпретации команды. Моделированию подвергаются следующие команд: ADD, Read.

ADD #4

Пусть (Akk(504)←Akk(500)+4(из адресной части)):

  1. Проверка Тп. Тп=1.

  2. Проверка условия INTR=1. Прерывание не произошло INTR=0.

  3. Выборка очередной команды из основной памяти

  • Запись адреса текущей инструкции в регистр адреса (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. Проверка Тп. Тп=1.

    2. Проверка условия INTR=1. Прерывание не произошло INTR=0.

    3. Выборка очередной команды из основной памяти

      1. Запись адреса текущей инструкции в регистр адреса (RA←IP=104)

      2. Ожидание готовности памяти (проверка условия ReadyRam=1)

      3. Копирование инструкции из регистра RD →RI

        00100

        11

        000000000000011000001100

    4. Проверка кода операции (≠00000). Код выбранной операции соответствует коду операции Read (00100)

    5. Вычисление исполнительного адреса операнда в основной памяти. Способ адресации –косвенная (11)

    6. Перемещаем операнд из памяти, т. к. СА=11

      1. Включение режима чтения из памяти (RD RAM режим=1)

      2. Инициализация ячейки памяти (адрес=400)

      3. Ожидание готовности памяти (проверка условия ReadyRam=1)

    7. Перемещаем операнд (1) из RD →Акк

    8. Увеличение указателя текущей команды IP=104+4=108

    9. Возврат в начало цикла (Тп=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 каждая функция характеризуется тремя признаками:

    1. Функция либо ожидает ввода символа в буфер, либо сразу выдает сообщение о том, что буфер пуст;

    2. Функция либо выполняет эхо-печать, либо эхо-печать отсутствует;

    3. Функция либо может быть прерванной другими функциями, например, 1BH, 23H (Ctrl_Break), либо нет.