ED-змінні є лише представленням вже існуючого десяткового числа через покажчик, логічно використання ассемблерной псевдокоманди EQU, яка не виділяє пам'ять під змінну. Надалі, при компіляції з асемблера в байт-код, використовуватиметься підстановка відповідного значення псевдокоманди EQU для відповідної BASED-змінної.
. Оператори:
. 1. Оператор присвоювання кодується в 6ти-байтовую SS команду MVN, що має формат:
MVN D1 (L, B1), D2 (B2)
де:
· D1 і D2 - зсув щодо базової адреси, що міститься в регістрі загального призначення;
· B1, B2 - регістри РОН, що містять адресу даних;
· L - довжина операндів в байтах
Команда MVN спеціалізована під копіювання числа з однієї адреси пам'яті в інший. Ця SS-команда вимагає більше число тактів, ніж RX-команда, однак спрощує вихідний еквівалент програми і не вимагає додаткового втручання для правильного копіювання чисел.
. 2. Оператор ADDR кодується у дві 4ех-байтові RX команди: LA і ST, тому в Асемблері IBM 370 відсутня команда, яка б копіювала адреса змінної у відповідне місце пам'яті. Ці команди мають однаковий формат:
LA R1, D2 (X2, B2) R1, D2 (X2, B2)
де:
· R1- регістр РОН;
· D2 - зсув щодо базової адреси, що міститься в регістрі загального призначення;
· X2 -регістри РОН, використовуваний в якості індексу;
· B2 - регістр РОН, що містять адресу даних;
Команда LA завантажує адресу змінної, зазначеної в якості другого операнда в перший операнд - регістр. А команда ST заносить значення першого операнда - регістра в другій операнд - змінну. Таким чином спочатку зчитується адреса змінної з пам'яті в регістр, а потім це значення заноситься в змінну-покажчик.
. 3. Оператор присвоювання - =. Змінні, розташовані по праву сторону від оператора кодуються залежно від типу:
. 3.1. Для BASED-змінних кодування відбувається в два етапи: 1) Завантаження значення покажчика в регістр за допомогою вже наявної у вихідному макеті команди L; 2) Завантаження значення змінної, розташованої по отриманим адресою за допомогою тієї ж команди L.
. 3.2. Завантаження десяткових змінних відбувається за допомогою комманди L. Таким чином, якщо йде привласнення однією десяткової змінної інший, то спочатку йде завантаження другого десяткової змінної в регістр за допомогою комманди L, а потім відбувається копіювання пам'яті за допомогою комманди MVN, описаної раніше.
Модифікація бази даних вихідного макета
У вихідний код для flex був доданий розбір нових лексем BASED, DECIMAL, ADDR і POINTER. Ці ж лексеми додані в набір токенов для bison.
Модифікація алгоритму вихідного макета
Розроблені синтаксичні правила були додані в набір правил для bison.
Були додані функції декларування десяткових змінних, уакзателей і BASED-змінних.
Додана функція poi, яка обробляє лексему ADDR. Ця функція генерує два асемблерні команди - LA і ST.
Функція opa модифікована для того, щоб оператор присвоєння замінювався на асемблерну функцію MVN, якщо операндом є десяткове число.
У функцію avi_ipe додана можливість підстановки замість слова, оголошеного псевдокоманда EQU, імені змінної.
У результаті був розроблений компілятор ЯВУ, позволяюща справлятися з поставленим завданням.
Плюси даної реалізації:
· використання вбудованих функцій асемблера для роботи з числами і адресами;
· BASED-змінні мають уявлення у вихідному файлі, що дозволяє більш точно відновити вихідний код по вихідному еквіваленту;
· не використовується пам'ять для BASED-змінних;
Мінуси даної реалізації:
· беззнакові десяткові числа;
· фіксована мантиса десяткових чисел;
· відсутність арифметичних операцій над десятковими числами;
· вихід файл сумісний тільки з асемблером ЕОМ IBM 370;
Основні переваги Flex і Bison над першою реалізацією компілятора ЯВУ:
· відсутність таблиці проекцій
· відсутність стека цілей і досягнень
· відсутність матриці суміжності і генерації матриці зв'язності
· відсутність 2ух проходів при розборі програми