Мнемонічне кодування спрощує процес написання, читання і відлагодження програми. Основний принцип такого кодування - кожна команда представляється 3-х або 4-х буквеним символом, який показує назву команди. Деякі приклади мнемонічного кодування:
ADD - додати (add),
SUB - відняти (subtract),
MPY - перемножити (multiply),
DIV - поділити (divide).
Операнди також представляються символічно. Наприклад команда ADD R Y означає додавання вмісту комірки пам'яті Y до вмісту регістра R. Зауважимо, що операція виконується над вмістом, а не над адресою комірки пам'яті та регістра.
Таким чином, з'являється можливість написання машинних програм в символічній формі. Повний набір символічних назв і правила їх використання утворюють мову програмування, відому як асемблерна мова. Символічні імена називаються мнемонічними, а правила їх використання для створення команд і програм називаються синтаксисом мови.
Програма, яка переводить із мнемонічного коду асемблерної мови в машинний, називається асемблером. Команди, які використовуються для переводу вихідної програми в асемблерну, називаються командами асемблера. Ці команди вказують як інтерпретувати назви, де розмістити програму в пам'яті, яка кількість комірок пам'яті необхідна для зберігання даних.
Варіанти інтерпретації бітів (розрядів) поля адреси з метою знаходження операнда називаються способами адресації. Коли команда вказує на операнд, він може знаходитись в самій команді, в основній або зовнішній пам'яті чи в регістровій пам'яті процесора. За роки існування комп'ютерів була створена своєрідна технологія адресації, яка передбачає реалізацію різних способів адресації, чому послужило ряд причин: забезпечення ефективного використання розрядної сітки команди; забезпечення ефективної апаратної підтримки роботи з масивами даних; забезпечення задання параметрів операндів; можливість генерації великих адрес на основі малих. Існує велика кількість способів адресації. Розглянемо п’ять основних способів адресації операндів в командах.
Пряма - в цьому випадку адресне поле зберігає адресу операнда. Її різновидом є пряма регістрова адресація, яка адресує не комірку пам’яті а номер регістру.
Безпосередня - в поле адреси команди поміщається не адреса, а сам операнд.
Непряма - в полі адреси команди зберігається адреса комірки пам’яті в якій знаходиться адреса операнда. Такій спосіб дозволяє оперувати з адресами як з даними. Різновид непряма-регістрова адресація, адреса адреси зберігається в регістрі загального призначення.
Відносна - адреса формується, як сума з двох доданків: бази, яка зберігається в спеціальному регістрі чи в одному з регістрів спеціального призначення, та зміщення, яке задається в полі адреси команди. Різновид індексна та базова індексна. При індексній замість базового регістра є індексний, який автоматично модифікується (зазвичай збільшується на 1). Базова-індексна адресація формується адреса як сума трьох доданків: бази, індексу та зміщення.
Безадресна - поле адреси в команді відсутнє. Адреса операнда, або немає змісту або є по замовчуванню (наприклад дії на спеціальним регістром - акумулятором). Безадресні команди неможливо використати для інших регістрів чи комірок пам’яті. Одним з різновидів безадресної адресації є використання стеку. В команду вводяться спеціальні ознаки з тим, щоб пристрій керування міг розпізнати використаний спосіб. Це можуть бути додаткові розряди в команді, або для різних типів команд закріплюватись різні способи адресації.
Варіант №9 | |||||||||||||
№ | Арифметичні | Логічні | Керування | Прапорці | Адресація | ||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | 2 | 3 | |||
9 | 3 | 5 | 9 | 1 | 2 | 17 | 2 | 10 | ZF | 2 | 3 | 5 | 1 |
1. Реалізація додаткових команд. Необхідно реалізувати 8 додаткових команд. Серед них 3 арифметичні, 3 логічні та 2 команди керування згідно варіанту. В таблиці представлено повний перелік множини інструкцій.
№ | Код інструкції | Двійкове значення | Зміст | Тип |
1 | ADD | 00000 | Додає вміст регістру regA до вмісту regB, та зберігає в destReg | R |
2 | DIV | 01000 | Беззнакове ділення destReg=regA/regB | R |
3 | IMUL | 01001 | Знакове множення destReg=regA*regB | R |
4 | XIDIV | 01010 | Знакове ділення і обмін операндів місцями destReg=regA/regB | R |
5 | AND | 01011 | Побітове логічне І: destReg=regA & regB | R |
6 | NAND | 00001 | Виконує логічне побітове І-НЕ вмісту regA з вмістом regB, та зберігає в destReg | R |
7 | XOR | 01100 | Додавання по модулю 2: destReg=regA # regB | R |
8 | CMPGE | 01101 | Порівняти regA regB destReg= regA >= regB | R |
Інструкції R-типу:
біти 24-22: код операції
біти 21-19: reg A
біти 18-16: reg B
біти 15-3: не використовуються (=0)
біти 2-0: destReg
№ | Код інструкції | Двійкове значення | Зміст | Тип |
9 | LW | 00010 | Завантажує regB з пам’яті. Адреса пам’яті формується додаванням зміщення до вмісту regA. | I |
10 | SW | 00011 | Зберігає вміст регістру regB в пам’ять. Адреса пам’яті формується додаванням зміщення до вмісту regA. | I |
11 | BEQ | 00100 | Якщо вміст регістрів regA та regB однаковий, виконується перехід на адресу програмний лічильник (ПЛ) + 1+зміщення, в ПЛ зберігається адреса поточної тобто beq інструкції. | I |
12 | JMAE | 01110 | Беззнакове більше/рівно if (regA>= regB) PC=PC+1+offSet | I |
13 | JMNAE | 01111 | Беззнакове не більше/рівно if (regA! >= regB) PC=PC+1+offSet | I |
14 | JNE | 10010 | Перейти, якщо більше чи рівно, if (ZF! =0) PC=offset | I |
I-тип інструкцій:
біти 24-22: код операції
біти 21-19: reg A
біти 18-16: reg B
біти 15-0: зміщення (16 біт, значення від - 32768 до 32767)
№ | Код інструкції | Двійкове значення | Зміст | Тип |
15 | JARL | 00101 | Спочатку зберігає ПЛ+1 в regB, в ПЛ адреса поточної (jalr) інструкції. Виконує перехід на адресу, яка зберігається в regA. Якщо в якості regA regB задано один і той самий регістр, то спочатку в цей регістр запишеться ПЛ+1, потім виконається перехід до ПЛ+1. | J |
16 | BSF | 10000 | Побітове сканування в прямому (від молодших до старших) напрямку regA в пошуках біта з 1, повертає номер позиції в destReg. Якщо 1 знайдено ZF=1, інакше ZF=0 | J |
17 | BSR | 10001 | Побітове сканування в зворотньому напрямку (від старших до молодших) regA в пошуках біта з 1, повертає номер позиції в destReg. Якщо 1 знайдено ZF=1, інакше ZF=0 | J |
J-тип інструкцій:
біти 24-22: код операції
біти 21-19: reg A
біти 18-16: reg B
біти 15-0: не використовуються (=0)
№ | Код інструкції | Двійкове значення | Зміст | Тип |
18 | HALT | 00110 | Збільшує значення ПЛ на 1, потім припиняє виконання, стимулятор має повідомляти, що виконано зупинку. | O |
19 | NOOP | 00111 | Нічого не виконується | O |
20 | PUSH | 10011 | Записати в стек з 1 регістру | O |
21 | POP | 10100 | Зчитати з стеку в 1 регістр | O |
O-тип інструкцій:
біти 24-22: код операції
біти 21-0: не використовуються (=0)