В этом сообщении будут исходники нашей ВМ. Пока она еще ничего не умеет. В первом файле создаем ВМ, загружаем программу из одной инструкции, запускаем и освобождаем память после использования.
Код:#вставка "library.h" #вставка <locale.h> //Во избежание "крокозяблей" на выводе #вставка <stdio.h> //Стандартный однобайтовый ввод-вывод #вставка <wchar.h> //"Широкие" многобайтовые символы и их ввод-вывод #вставка <wctype.h> //"Классификация" широких символов #вставка "vm.h" //Внешний интерфейс виртуальной машины // при подключении файлов из других папок будьте внимательны с путями, // так как перед компиляцией С/С++ файлы будут находится в папке .src/ цел main() { //включение всех локалей setlocale(LC_ALL, ""); system("cls"); пчтф16(L"Новый проект.\n"); //в переменной типа ТВМ "упакована" все внутреннее устройство ВМ: // регистры, стек, память указатели и тд. ТВМ* ВМ1 = создать_ВМ(); // программа состоящая их одной тестовой инструкции. б64 программа = 16"FFFF; //Тут требуется подумать. Программа загружается как массив байтов. загрузить_ВМ(ВМ1,(симв*) &программа, (симв*)((&программа)+1)); //Наверное, имеет смысл совсместить загрузку и старт программы в одной инструкции. старт_ВМ(ВМ1); // освобождаем динамически выделенную память под ВМ. закрыть_ВМ (ВМ1); читз(); вернуть 0; }
В следующих двух файлах описана интерфейсная часть ВМ. То есть, какие функции доступны нам для использования ВМ.
Код:#если_нет VM_H #макрос VM_H //=========================================================== // Файл: vm.rh // Версия: 1.00 // Дата: 17.06.2022 // Описание: Описание внешнего интерфейса виртуальной машины (ВМ) // доступ к внутренним структурам ВМ извне напрямую запрещен // Автор: //=========================================================== тип структура ТВМ ТВМ; // Внешний интерфейс управления виртуальной машиной ТВМ* создать_ВМ(); // конструктор пуст закрыть_ВМ(ТВМ* эта_ВМ); // деструктор пуст загрузить_ВМ(ТВМ* эта_ВМ, симв * старт_адрес, симв* стоп_адрес); // загрузка программы в байт-кодах в ВМ пуст старт_ВМ(ТВМ* эта_ВМ); // запуск работы ВМ #к_если //VM_HКод://=========================================================== // Файл: vm.r // Версия: 1.00 // Дата: 17.06.2022 // Описание: Реализация интерфейса виртуальной машины (ВМ) // доступ к внутренним структурам ВМ извне напрямую запрещен // Автор: //=========================================================== #вставка "library.h" #вставка "vm.h" #вставка "vm_core.h" // Конструктор виртуальной машины ТВМ* создать_ВМ() { ТВМ* врем = (ТВМ*) malloc (sizeof(ТВМ)); /****начало тестового блока****/ врем->имя[0] = 'V'; врем->имя[1] = 'M'; врем->имя[2] = '1'; врем->имя[3] = '\n'; врем->имя[4] = '\0'; /****конец тестового блока****/ вернуть врем; } // Деструктор виртуальной машины пуст закрыть_ВМ(ТВМ* эта_ВМ) { free(эта_ВМ); } // загрузка программы в байт-кодах в ВМ пуст загрузить_ВМ(ТВМ* эта_ВМ, симв * старт_адрес, симв* стоп_адрес) { эта_ВМ->РЕГИСТР_А = *((б64*) старт_адрес); } //Запуск виртуальной машины пуст старт_ВМ(ТВМ* эта_ВМ) { /****начало тестового блока****/ пчтф(эта_ВМ->имя); если (эта_ВМ->РЕГИСТР_А == 16"FFFF){ пчтф16(L"Выполнена тестовая инструкция!\n"); } /****конец тестового блока****/ }
А теперь начало реализации самой ВМ.
Код:#если_нет VM_CORE_H #макрос VM_CORE_H //=========================================================== // Файл: vm_core.rh // Версия: 1.00 // Дата: 17.06.2022 // Описание: Описание внутреннего устройства виртуальной машины (ВМ) // Автор: //=========================================================== #макрос РЕГИСТР_А регистры[0] #макрос РЕГИСТР_Б регистры[1] #макрос РЕГИСТР_В регистры[2] #макрос РЕГИСТР_Г регистры[3] #макрос РЕГИСТР_Д регистры[4] #макрос РЕГИСТР_Е регистры[5] #макрос РЕГИСТР_Ж регистры[6] #макрос РЕГИСТР_З регистры[7] #макрос РЕГИСТР_И регистры[8] #макрос РЕГИСТР_К регистры[9] #макрос РЕГИСТР_Л регистры[10] #макрос РЕГИСТР_М регистры[11] #макрос РЕГИСТР_Н регистры[12] #макрос РЕГИСТР_О регистры[13] #макрос РЕГИСТР_П регистры[14] #макрос РЕГИСТР_Р регистры[15] // Структура,описывающая виртуальную машину структура ТВМ { симв имя[10]; б64 регистры[16]; }; #к_если //VM_CORE_H