МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
ЗВІТ
про виконання лабораторної роботи № 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
Висновок: На даній лабораторній роботі я розширив архітектуру системи команд симулятора машини Ноймана, склав програму на асемблері з розшириним набором команд, перетворив її у машинні коди, запустив симулятор, увів до нього коди машинних команд, проаналізував отримані результати.