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

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

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


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


Существует команда вызова подпрограммы и выхода их неё?

Сообщений 1 страница 5 из 5

1

Что сейчас происходит с прогрессом по командам процессора?

Можно ли сказать, что каждая из команд процессора детально и подробно описана несколькими параграфами текста?
Существует ли полный список команд, который можно просмотреть по мнемонике, по опкоду, по классификатору групп команд?

Существует ли описание устройств процессора (регистров? возможностей АЛУ?)

Существует ли описание того, как организовывать безусловные, условные переходы, циклы разных видов?

Придумано ли что-нибудь для работы с внешним миром?

Мне известно минимум три способа с внешним миром общаться:
1) на уровне языка программирования (вызов "стандартных исполнителей") тем же способом,
  каким вызывают стандартные подпрограммы языка программирования (так сделано в КуМир, так работают динамически-загружаемые библиотеки в Си)
2) специальные инструкции, выполняющие какие-то функции ввода-вывода (BIOS = Basic Input-Output System, int 13, int 10)
  (так работает инструкция syscall в Linux)
  Вижу какой-то "свыз", но где к нему описание? Два описания - спецификация и учебник с несколькими примерами для копипастинга.
3) ввод-вывод в порты и входящие сигналы-прерывания от устройств
  (очень низкоуровневый способ для текущих задач, но облегчает реализацию имитации многопроцессорности)

Вопрос - как вызывать подпрограмму в Сказочной Колеснице?

Я так понял, что надо поместить адрес продолжения в стек, изменить регистр стека (увеличить, кстати, или уменьшить?),
затем выполнить переход на подпрограмму.  Как называется регистр стека (или это любой регистр? всё равно для вызова внешних программ должно быть соглашение между разными программистами - какой именно регистр будет использоваться в качестве стекового).
А при выходе из подпрограммы выполнить всё в обратном порядке - извлечь адрес из стека, и выполнить обратный переход.
Но команда перехода требует конкретное число (прмч), а не регистр. Необходимо будет динамически формировать исполняемый код на ходу?

Мнемоники для помещения в стек и извлечения из стека - у них есть описание? Как именно они работают, например увеличивают или уменьшают регистр? Какой именно? Если это отдельный регистр, то где его название?

Считаю, что строчку "Версия" надо нафиг стереть, а на её место написать строчку "Гипертекстовая ссылка на документацию: ..."

Отредактировано Лис (2023-04-18 23:13:08)

0

2

Ранее по теме
Сколько стеков нужно языковой виртуальной машине?

https://tvoygit.ru/stein47/russian-virt … /vm.r#L559

Код:
вс +=1;  // стек растет в сторону меньших адресов

Копирование комментариев зло. Принцип "не повторяй себя". Тут надо было гиперссылку на единое описание работы стека.

То, что тут написано - запутывает.
+1 это "растёт"? НЕТ, это уменьшается! но как так, если плюс, это не минус?

https://tvoygit.ru/stein47/russian-virt … rh#L39-L42

Код:
  ТЭЛЕМЕНТ_СТЕКА *вершина_стека;    // вс
  ТЭЛЕМЕНТ_СТЕКА *кадр_стека;       // кс
  ТЭЛЕМЕНТ_СТЕКА *стек;             // с
  б64 размер_стека;

Целых четыре слова семь слов! Какое из них вписывать в программу?

Если ты думаешь, что пользователь машины станет с этим разбираться, ты ошибаешься,
он просто не будет, так же как сейчас не пользуются КуМир-ом.
Просто потому что КуМир недостаточно качественно задокументирован (его сложно расширять, хотя вроде бы ничего не мешает понаделать своих исполнителей).

Отредактировано Лис (2023-04-18 23:47:22)

0

3

А что со стеком в КуМире?
https://github.com/a-a-maly/kumir2/blob … /stack.hpp

template <class T> class Stack
(ну, это лишнее, и шаблон и класс). Стек всего один вообще, у него нет экземпляров.

Если бы машина была многоядерной, да, структура для стека могла бы помочь (и то это в операционной системе - информация о нити).
Но зачем это всё, если стек часть оперативной памяти?
Или в КуМире он не часть?

Стек вызовов там, похоже, совершенно отдельный:

Код:
const Stack<Context> &callStack() const
	{
    return contextsStack_;
	}

(интересно, это хорошо или плохо? насколько плохо для аппаратной реализации?)

https://github.com/a-a-maly/kumir2/blob … #L202-L204

Stack<Variable> valuesStack_;
Stack<Context> contextsStack_;
Stack< std::pair<bool, Variable> > cacheStack_;

А третий стек зачем?

Для работы с ним есть две инструкции:

Код:
	case CLOAD:
    do_cload();
    break;
	case CSTORE:
    do_cstore();
    break;

И что-то я таких инструкций не вижу:
байткод КуМир-а

то-ли они новые, то ли незадокументированные...

https://github.com/a-a-maly/kumir2/blob … pp#L41-L43

CSTORE      = 0x30, // Copy value from stack head and push it to cache
CLOAD       = 0x31, // Pop value from cache to push it to main stack
CDROPZ      = 0x32, // Drop cache value in case of zero value in specified register

Я ничего не понял. А для чего этот кеш нужен? И для чего нужны эти инструкции?
Поиском в интернете, они, конечно, не ищутся. Надо детально понимать все исходники.

В общем, не надо делать так же, надо сделать хорошо задокументированный проект.

Отредактировано Лис (2023-04-19 00:13:23)

0

4

Как мы уже видели, существуют проекты,
которые парсят официальную документацию компании Интел
для того, чтобы работать с инструкциями.

Надо изначально сделать как-то так же.
Формальное описание инструкций, которое с одной стороны идёт в документацию,
а с другой стороны преобразуется в работающий код.

Тут желательно продумать процесс подготовки документации,
чтобы она (документация) была удобной в использовании (а не как полученная из-под doxygen)
и полной (ничего не пропускала, не отставала).

Сделать это один раз на текущем уровне развития не получится. Придётся делать несколько раз.
Можно было бы попробовать сначала сделать шаблонизатор, но это только для HTML бы помогло.
Для работы с бумагой у нас вообще ничего нет (PDF/A-вражеский стандарт и сложный, там внутри описания шрифтов, кривых Безье и т.п.)

Поэтому, для начала, в процесс сборки могла бы быть встроена утилита,
которая читает на входе формальное описание команд, а на выходе формирует .tex-файлы,
которые затем инклюдятся в человеческое описание, написанное руками.
(это мог бы сделать и шаблонизатор)
Ну и ещё хорошо бы утилиту, которая проверяет, что "не осталось лишних запчастей", то есть команд, не попавших в документацию.
(а с этим шаблонизатор не справится)

Если помещать все описания в одно место и обрабатывать независимо от их количества, то они точно все будут вставлены по дизайну,
но всё равно могут быть не все описаны.

Кроме ошибки недостаточного описания может быть ещё другая ошибка, когда команду удалили, а описание осталось.

Отредактировано Лис (2023-04-19 01:11:09)

0

5

Лис написал(а):

+1 это "растёт"? НЕТ, это уменьшается! но как так, если плюс, это не минус?

Обрабатывается команда извлечения из стека. Количество занятых ячеек стека УМЕНЬШАЕТСЯ. При этом адрес вершины стека УВЕЛИЧИВАЕТСЯ. Увеличивается он потому, что стек растет в сторону меньших адресов. Тут как комментарий не напиши, все равно кому-то будет непонятно.

Лис написал(а):

Вижу какой-то "свыз", но где к нему описание?

Это системный вызов. Пока в пробном виде. Нужно реализовать полную/достаточную коллекцию коллекцию системных вызовов. Описания пока нет. Аргументы передаются через регистры ВМ.

Лис написал(а):

Вопрос - как вызывать подпрограмму в Сказочной Колеснице?

Вызов подпрограммы и возврат из нее в настоящий момент не реализованы.

Лис написал(а):

Мнемоники для помещения в стек и извлечения из стека - у них есть описание? Как именно они работают, например увеличивают или уменьшают регистр? Какой именно? Если это отдельный регистр, то где его название?

Вершине стека соответствует РОН р29 (регистры[29]), базе стекового кадра р30. Переменные "вершина_стека" и "кадр_стека" являются указателями на эти регистры. Нужны для ускорения доступа. Есть четыре команды помещения в стек (опкоды: ПМСТ1, ПМСТ2, ПМСТ4, ПМСТ) 8-, 16-, 32- и 64-битного числа из регистра. Выравнивание по 64 битной границе. Аналогично 4 команды извлечения из стека.

0


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