ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » Проект "Виртуальные машины" » Первая реализация. Исходники.


Первая реализация. Исходники.

Сообщений 61 страница 62 из 62

1

В этом сообщении будут исходники нашей ВМ. Пока она еще ничего не умеет. В первом файле создаем ВМ, загружаем программу из одной инструкции, запускаем и освобождаем память после использования.

main.r
Код:
 
#вставка    "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.rh vm.r
Код:
#если_нет 	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.rh
Код:
#если_нет 	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

0

61

Евгений написал(а):

придется использовать уникальные префиксы и суффиксы

Тогда лучше .so-файлы с разными именами, но одинаковыми именами функций...
имена .so файлов хотя бы видно в файловой системе.

Отредактировано Лис (2023-03-12 02:13:37)

0

62

Добавил новую ветку, в которой проект преобразован в мультипроект.
Более подробную информацию смотри тут.

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » Проект "Виртуальные машины" » Первая реализация. Исходники.