МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
ЗВІТ
про виконання  лабораторної роботи № 4
«Робота з симулятором машини Ноймана. Дослідження архітектури системи команд.»
з дисципліни
«Архітектура комп’ютерів»
Львів – 2012
Мета: зрозуміти принципи виконання архітектури системи команд на симуляторі машини Ноймана, зрозуміти і дослідити виконання інструкції.
Теоретичні відомості
Загальна схема роботи асемблера (рис. 1) складається з 2 проходів. На першому проході асемблер перевіряє коректність синтаксису команд. На другому виконується генерування відповідних машинних команд, тобто числового представлення асемблерної команди. 
Функція  readAndParse виконує зчитування рядку асемблерної програми і декодування на відповідні поля: мітка, код операції, операнди. Отримана таким чином і декодована інструкція перевіряється на коректність: існування команди, відповідна кількість аргументів, існування міток та т. п. 
Функція testRegArg перевіряє коректність використання назви регістра. 
Функція testAddrArg перевіряє коректність використання адреси. 
Функція labelArray перетворює відповідну мітку у адресу.
Program.as та program.mc – відповідно вхідний та вихідний файли.
Симулятор починає свою роботу ініціалізацією пам’яті та регістрів 0 значеннями (рис. 2.). Наступним кроком відбувається заванаження програми у машинних кодах в пам’ять. Далі відбувається покрокове виконання інструкцій та вивід стану на зовнішній пристрій (чи на екран консолі чи у файл).
У stateStruct зберігається стан машини – значення регістрів, пам’яті та програмний лічільник. stateStruct
Функція Run виконує обробку інструкцій з пам’яті, функція printState виводить поточний стан машини, а функція convertNum виконує перетворення числа у доповняльний код.
Завдання:	 розширити архітектуру систему команд симулятора машини Ноймана, скласти програму на асемблері з розшириним набором команд, перетворити її у машинні коди, запустити симулятор, увести до нього  коди машинних, проаналізувати і пояснити отримані результати, довести коректність роботи розширеного набору команд,  скласти звіт з виконання лабораторних досліджень та захистити його.
Варіант № 20 ->  If А==B Des=1, else Des=0
Хід роботи
Заміняємо код в вайлі assemble на свій згідно з варінтом
…
#define FUNC 7
... 
/* check register fields */
	if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") ||
		!strcmp(opcode, "lw") || !strcmp(opcode, "sw") ||
		!strcmp(opcode, "beq") || !strcmp(opcode, "jalr") || 
		!strcmp(opcode, "FUNC")) {
	    testRegArg(arg0);
	    testRegArg(arg1);
	}
	if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") || !strcmp(opcode, "FUNC")) {
	    testRegArg(arg2);
	}
…
} else if (!strcmp(opcode, "FUNC")) {
	   num = (FUNC << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16)
		    | atoi(arg2);
	}
…
Заміняємо код в вайлі simulate на свій згідно з варінтом
…
else if (opcode == FUNC) {
		if (state.reg[arg0] == state.reg[arg1])
		state.reg[arg2] = 1;
		else
		state.reg[arg2] = 0;
	}
…
Створюю тестову програму.
      lw      0       1       A        load reg1 with A 
      lw      0       2       B        load reg2 with B
      FUNC    1       2       3        my Func 
      halt                             end of program 
      A    .fill   5 
            B    .fill   10
Запускаю створену програму на асемблювання та отримую наступні машинні інструкції.
8454148
8519685
30015491
25165824
5
             10
Запускаю тестову програму на симуляцію. 
memory[0]=8454148
memory[1]=8519685
memory[2]=30015491
memory[3]=25165824
memory[4]=5
memory[5]=10
@@@
state:
	pc 0
	memory:
		mem[ 0 ] 8454148
		mem[ 1 ] 8519685
		mem[ 2 ] 30015491
		mem[ 3 ] 25165824
		mem[ 4 ] 5
		mem[ 5 ] 10
	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 ] 8454148
		mem[ 1 ] 8519685
		mem[ 2 ] 30015491
		mem[ 3 ] 25165824
		mem[ 4 ] 5
		mem[ 5 ] 10
	registers:
		reg[ 0 ] 0
		reg[ 1 ] 5
		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 ] 8454148
		mem[ 1 ] 8519685
		mem[ 2 ] 30015491
		mem[ 3 ] 25165824
		mem[ 4 ] 5
		mem[ 5 ] 10
	registers:
		reg[ 0 ] 0
		reg[ 1 ] 5
		reg[ 2 ] 10
		reg[ 3 ] 0
		reg[ 4 ] 0
		reg[ 5 ] 0
		reg[ 6 ] 0
		reg[ 7 ] 0
end state
@@@
state:
	pc 3
	memory:
		mem[ 0 ] 8454148
		mem[ 1 ] 8519685
		mem[ 2 ] 30015491
		mem[ 3 ] 25165824
		mem[ 4 ] 5
		mem[ 5 ] 10
	registers:
		reg[ 0 ] 0
		reg[ 1 ] 5
		reg[ 2 ] 10
		reg[ 3 ] 0
		reg[ 4 ] 0
		reg[ 5 ] 0
		reg[ 6 ] 0
		reg[ 7 ] 0
end state
machine halted
total of 4 instructions executed
final state of machine:
@@@
state:
	pc 4
	memory:
		mem[ 0 ] 8454148
		mem[ 1 ] 8519685
		mem[ 2 ] 30015491
		mem[ 3 ] 25165824
		mem[ 4 ] 5
		mem[ 5 ] 10
	registers:
		reg[ 0 ] 0
		reg[ 1 ] 5
		reg[ 2 ] 10
		reg[ 3 ] 0
		reg[ 4 ] 0
		reg[ 5 ] 0
		reg[ 6 ] 0
		reg[ 7 ] 0
end state
Висновок:  На даній лабораторній роботі я розширив архітектуру системи команд симулятора машини Ноймана, склав програму на асемблері з розшириним набором команд, перетворив її у машинні коди, запустив симулятор, увів до нього  коди машинних команд, проаналізував отримані результати.