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

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

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


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


Множество команд просто реализуется и этого достаточно.

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

1

Нужно ли моделировать механизм виртуальной памяти?

Валерий написал(а):

Множество команд просто реализуется и этого достаточно

Как реализовать множество, это вроде бы понятно. Ну, например перечислить в спецификации в виде списка из элементов.
Но как насчёт самих команд, как реализовать их, каждую из них? Что они такое? Как их реализовать "просто"?

Есть мнение, что команда это синтаксическая конструкция, состоящая из элементов, да и сами те элементы непростые, ссылающиеся на различные таблицы (таблицу меток, например).

И вроде бы как это дело программы-ассемблера, заниматься разбором таких команд и превращением их в последовательность битов,
а не дело виртуальной машины по эмулированию таких команд на том железе, какое есть..
Но не совсем. Ассемблер реализовывает это превращение опираясь на спецификацию виртуальной машины.

Значит в спецификации должен быть описан алгоритм превращения.
То есть и результаты работы алгоритма (биты, байты, их группы), и его входные данные (то есть, части синтаксической конструкции).
Причём таких алгоритмов может быть несколько, и они могут быть достаточно сложными
(например когда число с плавающей точкой в научной нотации превращается в битовую запись в соответствии со стандартом
(а их несколько - стандартов хранения чисел с плавающей точкой, даже для одной и той же битности!))

Отредактировано Лис (2023-02-24 02:02:06)

0

2

Пример синуса, канонизированный Уткиным.

Российские разработки традиционно отличаются немощью, там разбираются только самые основы, которые уже были изучены в 1960-х годах, поэтому они не учитывают реалий аппаратуры 21-го века (в частности наличия арифметических сопроцессоров, не говоря уже о встроенной в ЦПУ графике).

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

Отредактировано Лис (2023-02-24 02:20:55)

0

3

Названия регистров для работы с плавающей точкой в Intel 64:
XMM0-XMM15
ST0-ST7
MM0-MM7
X87 FPU Control Word
X87 FPU Status Word
X87 FPU Tag Word
X87 FPU Data Pointer
X87 FPU Instruction Pointer

XMM11 это один из (16-ти) "векторных регистров", имеет размер 128 бит (16 байт).
Может использоваться для хранения (?) двух целых чисел или двух чисел с плавающей точкой.

Группа операций процессора называется Streaming SIMD Extensions.

Стандарт, описывающий побитовую раскладку называется IEEE 754.

sinxx %XMM11, %XMM12

инструкция movaps позволяет перемещать данные из одного 128-битного регистра в другой, или в память.
«Moves 4, 8 or 16 single-precision floating-point values from the source operand to the destination operand»

movaps %XMM11, [rsp+offset]

Пример (неудачный) документации:
https://www.felixcloutier.com/x86/movaps

operand is a memory operand, the operand must be aligned on a 16-byte (128-bit version), 32-byte (VEX.256 encoded version) or 64-byte (EVEX.512 encoded version) boundary or a general-protection exception (#GP) will be generated.

Чем плоха эта документация:
1) команда описывается в обобщённом виде. Мне не надо знать про все варианты. Мне нужно понятное объяснение:
- как записывать инструкцию
- на что в записи надо обращать внимание (из каких частей её собирать)
- какими битами кодируется результат и как это делается
- какой эффект вызывает инструкция (что где изменяется)
Не смысла экономить и снижать количество HTML-страниц. Можно сгенерировать описание для каждой отдельной инструкции, а так же обобщённое описание, всё на разных страницах.
2) алгоритм преобразования разбросан где-то и его будет не просто собрать воедино даже для ChatGPT (я пробовал, результата добиться не удалось).
3) использованные части, слова и понятия не определены. А ведь не сложно было добавить по гиперссылке на описание каждого слов, места на экране гиперссылки много не занимают.

Помогает ли wiki, как движок?
https://en.wikipedia.org/wiki/MOVAPD
The source operand can be either an XMM register (xmm2) or a memory address (m128).
The destination operand can be either an XMM register (xmm1) or a memory address (m128).
m128 — A memory double quadword operand in memory.
Ну хорошо, а чем m128 отличается от номера регистра? Или какая связь с адресом в памяти, там же не непосредственное значение?

Вот ещё описание:
https://c9x.me/x86/html/file_module_x86_id_180.html
здесь лучше, привели бинарный код инструкции:
0F 28 /r
не всё равно недостаточно объяснили его.
Объясняется ли как формируются биты этого "/r" ? Нет, на этой странице не объясняются и нет гиперссылки куда надо.

Эту /r они скопировали из руководства Intel.
«/r — Indicates that the ModR/M byte of the instruction contains a register operand and an r/m operand.»
(Cтраница 574 английской версии руководства)

Лично мне всё равно непонятно, как тут биты записывать.

MOVAPD—Move Aligned Packed Double-Precision Floating-Point Values

66 0F 28 /r
MOVAPD xmm1, xmm2/m128
66 0F 29 /r
MOVAPD xmm2/m128, xmm1

https://shell-storm.org/x86doc/MOVAPS.html
Страница хороша тем, что на ней есть некоторое подобие псевдоалгоритма:
MOVAPS (128-bit load- and register-copy- form Legacy SSE version)
DEST[127:0] (cid:197) SRC[127:0]
DEST[MAX_VL-1:128] (Unmodified)
Но получается, что это ещё язык, который надо изучать.
(и как обычно, нет гиперссылок, для обучения не подходит).

https://stackoverflow.com/questions/667 … structions
Сообщают, что инструкция кодируется тремя байтами. Это хорошо.
Рекомендуют прочитать:
- Intel Optimization Manual
- Agner Fog, microarchitecture guide
(это просто "на память").

Есть ещё табличка:
Instruction Operand Encoding
Op/En Operand 1 Operand 2
RM ModRM:reg (w) ModRM:r/m (r)
MR ModRM:r/m (w) ModRM:reg (r)

Тут предполагается, что читающий знает:
1) как кодируются регистры
2) как кодируется байт ModRM, как добавляется адрес памяти
это "режим адресации".
(гиперссылки, конечно, нет)

https://stackoverflow.com/questions/150 … e-notation
xmm/m128 — An XMM register or a 128-bit memory operand. The 128-bit XMM registers are XMM0 through XMM7; XMM8 through XMM15 are available using REX.R in 64-bit mode. The contents of memory are found at the address provided by the effective address computation.
(это цитата со страницы 578 руководства)

Тут уже чуть понятнее, но опять же нет ссылки на описание "effective address computation".

«An effective-address calculation uses a 64-bit base and index registers and sign-extend displacements to 64 bits.»
Это страница 74 руководства.

«Generally, displacements and immediates in 64-bit mode are not extended to 64 bits. They are still limited to 32
bits and sign-extended during effective-address calculations. In 64-bit mode, however, support is provided for 64-
bit displacement and immediate forms of the MOV instruction.»
Там же. Здесь я просто не понял, что написано. каким образом этот support провайдится?

Отредактировано Лис (2023-02-24 07:11:51)

0

4

movaps %xmm11, 0x89ABCDEF(%RSP)
movaps xmmword ptr [rsp + 0x89ABCDEF], xmm11
44 0f 29 9c 24 ef cd ab 89

44 - REX префикс
0f 29 - код инструкции
9c - ModR/M
24 - SIB
ef cd ab 89 - константа

0

5

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

(например когда число с плавающей точкой в научной нотации превращается в битовую запись в соответствии со стандартом
(а их несколько - стандартов хранения чисел с плавающей точкой, даже для одной и той же битности!))

Нужно ли вообще реализовывать вещественное число - это вопрос применения конкретных алгоритмов,
то есть разработчик (или просто человек, хочущий решить задачу) задает себе вопросы:
нужно ли использовать вещественные числа в данном конкретном алгоритме?
и если без вещественных (действительных) чисел не обойтись,
то можно ли переделать алгоритм на работу с целыми числами?

Нужно ли (можно ли) использовать длинную арифметику или нет нужды?
Будет ли алгоритм с длинной арифметикой лучше аналогов?

0

6

Я им/вам уже про это писал. Что для создания компилятора и web-сайта плавающая точка не нужна. А для создания IDE нужна, потому что "исполнитель черепашка" может поворачиваться на углы. Как тут без синуса?
Тем более с этим новыми огромными мониторами 8К (HiDPI), для которых все графические фреймворки переводят с целочисленных систем координат на системы координат с плавающей точкой.

Отредактировано Лис (2023-02-27 09:38:47)

0

7

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

"исполнитель черепашка" может поворачиваться на углы. Как тут без синуса?
Тем более с этим новыми огромными мониторами 8К (HiDPI),
для которых все графические фреймворки переводят
с целочисленных систем координат на системы координат с плавающей точкой.

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

Потом треугольники или квадраты заливаются цветом,
и пускают свет из определённой точки.

А черепашку нужно не просто поворачивать на угол,
а поворачивать её на тот угол,
который бы указывал на точку с целыми координатами.
Поворот черепашки на одну десятую градуса значит,
что она будет направлена в точку (1000000000, 1745328).
И тут уже нужна длинная арифметика,
потому что чем длиннее будет длинная арифметика,
тем дольше черепашка будет адекватно двигаться и поворачиваться на разные вещественные углы.
Если длиннота длинной арифметики будет короткой,
то черепашка после буквально нескольких поворотов "выйдет из под контроля",
то есть правильность её передвижений нарушится,
черепашка перестанет возвращаться туда, откуда она пришла,
сумма поворотов будет 360 градусов,
а конечная точка черепашки будет отличаться от точки старта.

ВЫВОД: В идеале длиннота длинной арифметики должна быть бесконечной.

0

8

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

В идеале длиннота длинной арифметики должна быть бесконечной.

И доходы тоже бесконечными. В идеале.

0

9

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

И доходы тоже бесконечными. В идеале.

Доходы-то любыми могут быть,
главное, чтобы прибыль была бесконечной.

Понятие "бесконечность" для богатства можно понять на таких примерах:
Например, самый богатый человек имеет бесконечное богатство.
То есть нет другого человека,
который бы мог купить большее, чем самый богатый человек.

Например, я выиграл пятьсот миллионов рублей в лотерею.
Тогда если я буду каждый день ездить на такси и
хорошо питаться, хорошо одеваться,
то за всю жизнь не успею потратить всю сумму.

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

0

10

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

Доходы-то любыми могут быть,
главное, чтобы прибыль была бесконечной.

Понятие "бесконечность" для богатства можно понять на таких примерах:
Например, самый богатый человек имеет бесконечное богатство.
То есть нет другого человека,
который бы мог купить большее, чем самый богатый человек.

Например, я выиграл пятьсот миллионов рублей в лотерею.
Тогда если я буду каждый день ездить на такси и
хорошо питаться, хорошо одеваться,
то за всю жизнь не успею потратить всю сумму.

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

Не верно. Потому что деньги - мера принуждения других людей.
Захочешь жить единолично на теплом островке или другом большом куске земли, в элитном отеле бизнес-центра, личную яхту или самолет - денег может и не хватить.
Богатство не дает вообще никаких прав на блага, которые никто не собирается продавать, даже прав знать о существовании и качествах таковых:)

Отредактировано MihalNik (2023-02-27 14:05:43)

0


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