Моделирование процессора
Этот проект моделирует простую компьютерную систему, состоящую из процессора и памяти. ЦП и память смоделируются отдельными процессами, которые общаются. Память содержит одну программу, которую ЦП будет выполнять, а затем моделирование закончится.
Для процессора:
- У него будут эти регистры: ПК, SP, IR, AC, X, Y.
- Это будет поддерживать инструкции, показанные ниже.
- Он запустит пользовательскую программу по адресу 0.
- Инструкции извлекаются в IR из памяти. Операнд может быть извлечен в локальную переменную.
- Каждая инструкция должна быть выполнена до того, как следующая инструкция будет извлечена.
- Пользовательский стек находится в конце памяти пользователя и растет по адресу 0.
- Системный стек находится в конце системной памяти и растет по адресу 0.
- Нет аппаратного обеспечения размера стека.
- Программа заканчивается, когда выполняется конечная инструкция. Два процесса должны закончиться в то время.
- Пользовательская программа не может получить доступ к системной памяти (выходит с сообщением об ошибке).
Для памяти:
- Он будет состоять из 2000 целочисленных записей, 0-999 для пользовательской программы, 1000-1999 для системного кода.
- Он будет поддерживать две операции: read (адрес) - возвращает значение по адресу; Записать (адрес, данные) - записывает данные по адресу
- Память будет инициализироваться, читая файл программы.
Для таймера:
- Таймер будет прерывать процессор после каждых инструкций X, где x является параметром командной строки.
Для обработки прерывания:
- Существует две формы прерываний: таймер и системный вызов с использованием инструкции Int.
- В обоих случаях процессор должен ввести режим ядра.
- Указатель стека должен быть переключен в системный стек.
- Регистры SP и ПК должны быть сохранены в системном стеке. (Обработчик может сохранить дополнительные регистры).
- Прерывание таймера должно вызвать выполнение по адресу 1000.
- Инструкция Int должна вызвать выполнение на адрес 1500.
- Прерывания должны быть отключены во время обработки прерываний, чтобы избежать вложенного выполнения.
- Инструкция IRET возвращается от прерывания.
Набор инструкций:
-> 1 = значение нагрузки # Загрузите значение в AC
-> 2 = загрузка addr # Загрузите значение по адресу в AC
-> 3 = LOADIND ADDR # Загрузите значение с адреса, найденного в данном адресе в AC. (Например, если LoadInd 500 и 500 содержит 100, затем загрузите из 100).
-> 4 = LoadIDXX ADDR # Загрузите значение AT (ADDREST+X) в AC. (Например, если LoadIDXX 500 и X содержит 10, то загрузите из 510).
-> 5 = LoadIdxy Addr # Загрузите значение AT (ADDREST+Y) в AC
-> 6 = loadspx # нагрузка от (sp+x) в переменный ток (если SP составляет 990, а x-1, нагрузка от 991).
-> 7 = хранить addr # хранить значение в AC в адрес
-> 8 = Get # Получает случайный int от 1 до 100 в AC
-> 9 = Поместите порт #, если порт = 1, записывает AC как int на экран; Если порт = 2, пишет AC как символ на экран
-> 10 = addx # добавить значение в x в AC
-> 11 = Addy # Добавьте значение в Y в AC
-> 12 = subx # Вычтите значение в x из AC
-> 13 = suby # вычтите значение в Y из AC
-> 14 = CopyTox # Скопировать значение в AC до x
-> 15 = CopyFromx # Скопировать значение в x в AC
-> 16 = CopyToy # Скопируйте значение в AC TO Y
-> 17 = CopyFromy # Скопировать значение в Y в AC
-> 18 = CopyTosp # копировать значение в AC в SP
-> 19 = CopyFromSp # Скопируйте значение в SP в AC
-> 20 = Jump addr # прыгните по адресу
-> 21 = Jumpifequal Addr # Прыжок по адресу только в том случае, если значение в AC равна нулю
-> 22 = Jumpifnotequal addr # прыгайте по адресу только в том случае, если значение в AC не равна нулю
-> 23 = Call addr # return return atember на стек, перейдите по адресу
-> 24 = ret # возвратный адрес POP из стека, перейдите по адресу
-> 25 = Incx # увеличить значение в x
-> 26 = decx # уменьшить значение в x
-> 27 = Нажмите # нажмите AC на стек
-> 28 = POP # POP из стека в AC
-> 29 = int # выполнить системный вызов
-> 30 = IRET # возвращение из системного вызова
-> 50 = End # End Execution
=================================================================================
Образец папка содержит 5 образцов файла.
Образец1.txt
- Проверка индексированных инструкций нагрузки.
- Отпечатает две таблицы, один из AZ, другой из 1-10.
Sample2.txt
- Тестирует инструкции по вызову/ret.
- Отпечатает лицо, где линии печатаются с использованием подпрограмм.
Sample3.txt
- Тестирует инструкции Int/IRet.
- Основной петлей - печать буквы А, за которым следует число, которое периодически увеличивается таймером.
- Число будет увеличиваться быстрее, если период таймера короче.
Sample4.txt
- Проверяет правильную работу пользовательского стека и системного стека, а также проверяет, что доступ к системной памяти в пользовательском режиме дает ошибку и выходы.
Sample5.txt
- Это тот, который вы должны создать. Обязательно включите комментарии, чтобы грейдер знал, что делает программа.
=================================================================================
Шаг для составления и выполнения проекта:
- S1: скопируйте исходные файлы в систему Linux.
- S2: Измените прямые на исходные файлы
- S3: запустите следующую команду: GCC Memory.c CPU.C Simulator.c
- S4: запустите программу: ./a.out
- S5: В соответствии с выводом информации, введите параметр таймера X, имя файла, которое вы хотите запустить соответственно. Каждый элемент заканчивается "Enter". Например: 10 ( n) образец2.txt
- S6: Повторите S4 для оставшихся образцов тестовых файлов, чтобы получить различные выходы