Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Лабораторна робота №3
з Архітектури комп’ютера
на тему: «Робота з симулятором машини Ноймана. Дослідження виконання асемблерної програми симулятора.»
Львів – 2013
Мета: опанувати роботу асемблера на симуляторі машини Ноймана, зрозуміти і дослідити принцип виконання програми машиною Ноймана.
Завдання: скласти програму на асемблері, перетворити її у машинні коди, запустити симулятор, увести до нього коди машинних, проаналізувати і пояснити отримані результати, скласти звіт з виконання лабораторних досліджень та захистити його.
Теоретичні відомості
В ході виконання даної лабораторної роботи розглядається симулятор та асемблер 32 розрядного CISC комп’ютера. Даний комп’ютер містить 8 регістрів (0 вий регістр завжди зберігає 0) та 65536 комірок пом’яті по 32 розряди. Набір машинних інструкцій складається з 8 команд (табл. 1).
Таблиця 1. Множина інструкцій
№
пп
Код
інструкції
2кове
СУТНІСТЬ ІНСТРУКЦІЙ МАШИНИ
Інструкції R-типу
1
add
000
Додає вміст регістру regA до вмісту regB, та зберігає в destReg
2
nand
001
Виконує логічне побітове І-НЕ вмісту regA з вмістом regB, та зберігає в destReg
I-тип
3
lw
010
Завантажує regB з пам’яті. Адреса пам’яті формується додаванням зміщення до вмісту regA.
4
sw
011
Зберігає вміст регістру regB в пам’ять. Адреса пам’яті формується додаванням зміщення до вмісту regA.
5
beq
100
Якщо вміст регістрів regA та regB однаковий, виконується перехід на адресу програмний лічильник(ПЛ) + 1+зміщення, в ПЛ зберігається адреса поточної тобто beq інструкції.
J-тип
6
jalr
101
Спочатку зберігає ПЛ+1 в regB, в ПЛ адреса поточної (jalr) інструкції. Виконує перехід на адресу, яка зберігається в regA. Якщо в якості regA regB задано один і той самий регістр, то спочатку в цей регістр запишеться ПЛ+1, а потім виконається перехід до ПЛ+1.
O-тип
7
halt
110
Збільшує значення ПЛ на 1, потім припиняє виконання, стимулятор має повідомляти, що виконано зупинку.
8
noop
111
Нічого не виконується
Формат лінійки асемблерного коду наступний (<пробіл> означає послідовність табуляцій і/або пробілів):
мітка <пробіл> інструкція<пробіл>поле№1<пробіл> поле№2<пробіл> поле№3<пробіл>коментар
Крайнє ліве поле лінійки асемблерного коду – поле мітки. Коректна мітка має складатися максимуму з 6 символів, символами можуть бути літери або цифри, але починатися з букви. Поле мітки є необов’язковим, проте пробіл після даного поля є обов’язковим.
Після не обов’язкової мітки іде обов’язковий пробіл. Далі іде поле назви інструкції, в якому може бути ім’я будь якої асемблерної інструкції зазначені вище в таблиці. Після пробілів ідуть відповідні поля. Всі поля можуть зберігати або десяткові значення або мітки. Кількість полів залежить від інструкції, поля які не використовуються ігноруються (подібно до коментарів).
Інструкції r-типу (add, nand) потребують наявності 3 полів: поле№1 – regA, поле№2 regB поле№3 destReg.
Інструкції і-типу (lw,sw,beq) вимагають 3 полів: поле№1 – regA, поле№2 regB поле№3 – числове значення зміщення чи символьна адреса. Числове значення може бути як додатнім так і відємним. Символьні адреси описані нижче.
Інструкція J-типу (jalr) вимагає 2 полів: поле№1 – regA, поле№2 regB
Інструкція 0-типу (noop, halt) не вимагає жодного.
Символьні адреси посилаються на відповідні мітки. Для інструкцій lw та sw асемблер має згенерувати зміщення, яке дорівнює адресі мітки. Вона може використовуватися з 0 регістром, тоді буде посилання на мітку, або може використовуватися з не нульовим базовим регістром у якості індексу масиву, який починається з мітки. Для інструкції beq, асемблер має перетворити мітку в числове зміщення куди має відбуватися перехід.
Після останнього поля має йти пробіл за яким може розміщуватися коментар. Коментар закінчується з кінцем лінії асемблерної програми.
Крім інструкцій асемблерна програма може містити директиву - .fill (зверніть увагу на точку попереду). Директива . fill повідомляє компілятору про те, що він має зберегти число за адресою відповідно де дана інструкція знаходиться. Директива .fill використовує одне поле, в якому може бути як число так і символьна адреса. Наприклад «.fill 32» означає зберегти число 32 за адресою де дана інструкція знаходиться. (Оскільки в нас кожен рядок програми відповідає адресі починаючи з 0, то відповідно адреса буде дорівнювати номеру рядка - 1). Директива . fill з символьною адресою збереже адрессу даної мітки. В прикладі нижче ".fill start" збереже значення 2, тому що мітка start знаходиться за адресою 2.
Код ассемблерної прогрма:
lw 0 1 start
lw 0 2 start
lw 0 3 one
lw 0 4 iter
lw 0 6 fifty
iter beq 1 6 end
add 1 3 1
add 2 1 2
beq 0 0 iter
end halt
fifty .fill 50
start .fill 42
one .fill 1
Отриманий асемблюванням відповідний асемблерній програмі файл з вісім розрядним гексадецимальним машинним кодом цієї програми має назву ak3.mc та наступне наповнення:
8454155
8519691
8585228
8650757
8781834
17694723
720897
1114114
16842748
25165824
50
42
1
Послідовність виконання асемблювання та симуляції (за допомогою програм assemble.exe та simulate.exe):
/
Початок
Кінець
memory[0]=8454155
memory[1]=8519691
memory[2]=8585228
memory[3]=8650757
memory[4]=8781834
memory[5]=17694723
memory[6]=720897
memory[7]=1114114
memory[8]=16842748
memory[9]=25165824
memory[10]=50
memory[11]=42
memory[12]=1
@@@
state:
pc 0
memory:
mem[ 0 ] 8454155
mem[ 1 ] 8519691
mem[ 2 ] 8585228
mem[ 3 ] 8650757
mem[ 4 ] 8781834
mem[ 5 ] 17694723
mem[ 6 ] 720897
mem[ 7 ] 1114114
mem[ 8 ] 16842748
mem[ 9 ] 25165824
mem[ 10 ] 50
mem[ 11 ] 42
mem[ 12 ] 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
machine halted
total of 39 instructions executed
final state of machine:
@@@
state:
pc 10
memory:
mem[ 0 ] 8454155
mem[ 1 ] 8519691
mem[ 2 ] 8585228
mem[ 3 ] 8650757
mem[ 4 ] 8781834
mem[ 5 ] 17694723
mem[ 6 ] 720897
mem[ 7 ] 1114114
mem[ 8 ] 16842748
mem[ 9 ] 25165824
mem[ 10 ] 50
mem[ 11 ] 42
mem[ 12 ] 1
registers:
reg[ 0 ] 0
reg[ 1 ] 50
reg[ 2 ] 414
reg[ 3 ] 1
reg[ 4 ] 17694723
reg[ 5 ] 0
reg[ 6 ] 50
reg[ 7 ] 0
end state
Висновок:
Під час виконання цієї лабораторної роботи я опанував роботу асемблера на симуляторі машини Ноймана, зрозуміти і дослідити принцип виконання програми машиною Ноймана.