Міністерство освіти та науки, молоді та спорту України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Звіт
З лабораторної роботи №4
З Архітектури комп’ютерів
На тему: Робота з симулятором машини Ноймана.
Дослідження архітектури системи команд.
Львів – 2012
Мета: зрозуміти принципи виконання архітектури системи команд на тимулятора машини Ноймана, зрозуміти і дослідити виконання інструкції.
Завдання: розширити архітектуру систему команд тимулятора машини Ноймана, скласти програму на асемблері з розшириним набором команд, перетворити її у машинні коди, запустити тимулятор, увести до нього коди машинних, проаналізувати і пояснити отримані результати, довести коректність роботи розширеного набору команд, скласти звіт з виконання лабораторних досліджень та захистити його.
Теоретичні відомості:
Рис. 1. Схема роботи асемблера
Загальна схема роботи асемблера (рис. 1) складається з 2 проходів. На першому проході асемблер перевіряє коректність синтаксису команд. На другому виконується генерування відповідних машинних команд, тобто числового представлення асемблерної команди.
Функція readAndParse виконує зчитування рядку асемблерної програми і декодування на відповідні поля: мітка, код операції, операнди. Отримана таким чином і декодована інструкція перевіряється на коректність: існування команди, відповідна кількість аргументів, існування міток та т. п.
Функція testRegArg перевіряє коректність використання назви регістра.
Функція testAddrArg перевіряє коректність використання адреси.
Функція labelArray перетворює відповідну мітку у адресу.
Program.as та program.mc – відповідно вхідний та вихідний файли.
Рис. 2 Функціональна схема тимулятора.
Симулятор починає свою роботу ініціалізацією пам’яті та регістрів 0 значеннями (рис. 2.). Наступним кроком відбувається заванаження програми у машинних кодах в пам’ять. Далі відбувається покрокове виконання інструкцій та вивід стану на зовнішній пристрій (чи на екран консолі чи у файл).
У stateStruct зберігається стан машини – значення регістрів, пам’яті та програмний лічільник. stateStruct
Функція Run виконує обробку інструкцій з пам’яті, функція printState виводить поточний стан машини, а функція convertNum виконує перетворення числа у доповняльний код.
Індивідуальне завдання згідно варіанту :
12варіан: циклічний зсув вліво
Зміни в кодах симулятора:
#define LCS 7
/////////////////////////////////////////////////////////////////////
int LCS(int,int);
/////////////////////////////////////////////////////////////////////
else if (opcode == LCS) {
if(state.reg[arg0]<0){
state.reg[arg0]<<=1;
state.reg[arg0]=state.reg[arg0]+1;
}
else{
state.reg[arg0]<<=1;
Зміни в кодах компілятора:
#define LCS 7
/////////////////////////////////////////////////////////////////////
if (strcmp(opcode, "add") && strcmp(opcode, "nand") &&
strcmp(opcode, "lw") && strcmp(opcode, "sw") &&
strcmp(opcode, "beq") && strcmp(opcode, "jalr") &&
strcmp(opcode, "halt") && strcmp(opcode, "LCS") &&
strcmp(opcode, ".fill") ) {
printf("error: unrecognized opcode %s at address %d\n", opcode,
address);
exit(1);
}
////////////////////////////////////////////////////////////////////
if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") ||
!strcmp(opcode, "lw") || !strcmp(opcode, "sw") ||
!strcmp(opcode, "beq") || !strcmp(opcode, "jalr") ||
!strcmp(opcode, "LCS")){
testRegArg(arg0);
testRegArg(arg1);
}
/////////////////////////////////////////////////////////////////////////
if ( (strcmp(opcode, "halt") &&
strcmp(opcode, ".fill") && strcmp(opcode, "jalr")&& strcmp(opcode, "LCS")
&& arg2[0]=='\0') ||
(!strcmp(opcode, "jalr") && arg1[0]=='\0') ||
(!strcmp(opcode, ".fill") && arg0[0]=='\0')) {
printf("error at address %d: not enough arguments\n", address);
exit(2);
}
//////////////////////////////////////////////////////////////////
} else if (!strcmp(opcode, "LCS")) {
num = (LCS << 22) | (atoi(arg0) << 19);
Текст тестової програми:
lw 0 1 var
start lcs 1
done halt
var .fill -1
stAddr .fill start
Результати виконання:
memory[0]=8454147
memory[1]=29884416
memory[2]=25165824
memory[3]=-1
memory[4]=1
@@@
state:
pc 0
memory:
mem[ 0 ] 8454147
mem[ 1 ] 29884416
mem[ 2 ] 25165824
mem[ 3 ] -1
mem[ 4 ] 1
registers:
reg[ 0 ] 0
reg[ 1 ] 0
reg[ 2 ] 0
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
@@@
state:
pc 1
memory:
mem[ 0 ] 8454147
mem[ 1 ] 29884416
mem[ 2 ] 25165824
mem[ 3 ] -1
mem[ 4 ] 1
registers:
reg[ 0 ] 0
reg[ 1 ] -1
reg[ 2 ] 0
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
@@@
state:
pc 2
memory:
mem[ 0 ] 8454147
mem[ 1 ] 29884416
mem[ 2 ] 25165824
mem[ 3 ] -1
mem[ 4 ] 1
registers:
reg[ 0 ] 0
reg[ 1 ] -1
reg[ 2 ] 0
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
machine halted
total of 3 instructions executed
final state of machine:
@@@
state:
pc 3
memory:
mem[ 0 ] 8454147
mem[ 1 ] 29884416
mem[ 2 ] 25165824
mem[ 3 ] -1
mem[ 4 ] 1
registers:
reg[ 0 ] 0
reg[ 1 ] -1
reg[ 2 ] 0
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
Висновок: в цій лабораторній роботі я дослідив архітектуру системи команд, отримав знання та навички для подальшої роботи, що створило підгрунтя для подальшого опрацювання матеріалу, виконання наступних лабораторних робіт та курсової роботи.