Основы архитектуры процессоров Intel 80x86 закладывались ещё во
времена преобладания восьмеричной системы - в имеющихся методах
кодировки операций, хотя архитектура уже базировалась на байтах
и побайтовой адресации, использующих шестнадцатиричную систему.
Однако, рудименты восьмеричной системы проглядываются во многих
кодах операций архитектуры Интел.
Максимальные значения первых двух байтов команд, весьма логично
выглядят как два восьмеричных кода - 377 и 377.
На месте первой семёрки первого байта - прослеживается основной
код операции TTT:
---------------------------------------
TTT Команда
---------------------------------------
000 ADD Сложение
010 ADC Сложение с переносом
100 AND Логическое И
001 OR Логическое ИЛИ
101 SUB Вычитание
011 SBB Вычитание с займом
110 XOR Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
---------------------------------------
На месте второй семёрки первого байта - прослеживается основной
код номера регистра - reg в командах загрузки непосредственных
данных в регистр, а также в однобайтовых командах - в операциях
с регистром: PUSH POP XCHG INC DEC
Однобайтовые коды команд - использовались не для самых наиболее
употребляемых команд присваивания значений := то есть, операций
пересылки значений - MOVE (загрузки в регистр - LOAD и записи в
главную память - STORE), а также частых операций сложения - ADD
и вычитания - SUB.
На месте второй семёрки первого байта прослеживается, во многих
командах модификатор длины операнда, а также модификатор записи
результата операции по месту - первого, либо - второго операнда
и модификатор операций с операндом - непосредственной константы
в главной памяти, в общем регистре, либо - аккумуляторе.
На месте первой тройки первого байта прослеживается модификатор
основного кода операции.
Второй байт команды - который называется - байт mod r/m - так и
делится разработчиком на три части - на месте первой тройки так
и расположен модификатор типа операнда - mod, правее - на месте
первой семёрки расположено поле reg и на месте второй семёрки в
конце байта расположено поле r/m.
В поле mod кодируется - тип памяти (регистр или главная память)
и длина смещения в байтах - в главной памяти.
На месте первой семёрки второго байта - прослеживается основной
код операции - TTT в тех случаях, когда он помещается именно во
второй байт команды, либо на этом месте расположен - код номера
регистра.
На месте второй семёрки второго байта - расположен или код r/m,
или код регистра.
Здесь не ставится цель описания структуры команнд - процессоров
данного типа, а просто показано - как восьмеричная система так,
глубоко, въелась в структуру команд и какие навороты - иначе не
скажешь, пришлось сделать разработчикам, при переходе - к числу
регистров, равному 16-ти (вместо 8-ми) - и к 64-разрядной длине
длине машинного слова и регистров процессора.
Для этого пришлось - отказаться от однобайтовых команд операций
инкремента-декремента и ограничиться таковыми двухбайтовыми.
Освободившийся диапазон кодов операций 40-4F занял специальный,
введённый дополнительно префикс REX.
Table 1-11. REX Prefix-Byte Fields
Mnemonic Bit Position Definition
- 7-4 0100
REX.W 3 0 = Default operand size
1 = 64-bit operand size
REX.R 2 1-bit (high) extension of the ModRM reg field(1),
thus permitting access to 16 registers.
REX.X 1 1-bit (high) extension of the SIB index field(1),
thus permitting access to 16 registers.
REX.B 0 1-bit (high) extension of the ModRM r/m field(1),
SIB base field1, or opcode reg field, thus
permitting access to 16 registers.
После этого - наглядность и простота кодирования команд процессоров
данного типа - и без того - явно не очень прозрачная, - значительно
усложнилась и запуталась, а просмотр таких кодов при отладке - стал
неким кошмаром.
Я отдаю должное - искусству логики разработчиков такого витиеватого
префикса и даже успел изрядно поработать над кодогенератором такого
набора команд, но гармонии от этого явно не прибавилось.
Префиксы длины операнда - их стало несколько - противоборствуют.
REX.W: Operand Width.
Setting the REX.W bit to 1 specifies a 64-bit operand size.
Like the existing 66h operand-size prefix, the REX 64-bit
operand-size override has no effect on byte operations.
For non-byte operations, the REX operand-size
override takes precedence over the 66h prefix.
If a 66h prefix is used together with a REX prefix that
has the REX.W bit set to 1, the 66h prefix is ignored.
However, if a 66h prefix is used together with a REX prefix
that has the REX.W bit cleared to 0,the 66h prefix
is not ignored and the operand size becomes 16 bits.
Поле кода номера регистра разъехалось по разным битам разных байтов.
REX.R: Register. The REX.R bit adds a 1-bit (high) extension
to the ModRM reg field (page 20) when that field encodes
a GPR, XMM, control, or debug register.
REX.R does not modify ModRM reg when that field specifies
other registers or opcodes.
REX.R is ignored in such cases.
Поля байта SIB - очередного искусного восмеричного наворота
разработчиков Интел - также - ещё более сложно навороченно,
разъехалось по разным битовым полям разных байтов.
REX.X: Index. The REX.X bit adds a 1-bit (high) extension to the
SIB index field (page 20).
Chapter 1: Instruction Formats 17
24594 Rev. 3.10 February 2005 AMD64 Technology
К тому же последний бит префикса присоединяется то туда, то сюда.
REX.B: Base.
The REX.B bit:
- either adds a 1-bit (high) extension to the base
in the ModRM r/m field or SIB base field,
- or it adds a 1-bit (high) extension to the
opcode reg field used for accessing GPRs.
(See Table 2-2 on page 47 for more about the REX.B bit.)
...
И при стольких искуссных ухищрениях в модернизации системы команд,
для того, чтобы ввести в архитектуру 8 дополнительных регистров,
новые 64-разрядные операционнные системы фирмы Майкрософт отбирают
на свои системные нужды ещё около четырёх регистров, оставляя, для
прикладных программ оставшиеся 4 регистра.
Этого конечно явно мало для разработки эффективных программ.
Операционные системы OS-360 (ОС ЕС) оставляли для своих прикладных
программ 12 регистров общего назначения.
Поэтому, при детальном рассмотрении проблемы недостатка регистров,
переход от восьмирегистрового поля, к шестнадцатирегистровому - не
оправлал ожидаемых надежд, если не сказать - вызвал разочарование.
Кроме того, большинство одно-двухбайтовых кодов операций, добавкой
префикса автоматически превращаются в двух-трёхбайтовые и это всё,
не считая байта поля mod/rm и байтов смещения-адреса - в операциях
с операндами в главной памяти, что заметно снижает - компактоность
загрузочных модулей, ну а самое главное, прозрачность и понятность
структуры - кода полей самой команды - рассредоточенного по многим
байтам кода операции, плюс кода байта mod/rm.
...
Ктому же:
С переходом от COM-модели оперативной памяти к FLAT-модели
оперативной памяти адреса загрузочного кода перестали быть
ПЕРЕМЕЩАЕМЫМИ - как и собственно, весь сам загрузочный код
исполняемого модуля как и сам исполняемоый модуль, который
требует построения дополнительных таблиц перемещений этого
модуля и дополнительной корректировки адресов при загрузке
этого модуля загрузчиком операционной системы.
Таблицы динамических подвызовов функций - из DLL-библиотек
в загрузочных модулях - меняются от одной среды WIN-32 API
к другой среде WIN-64 API и найти исчерпывающие документы,
руководства и техническго описания, весьма затруднительно.
Весьма затруднительно - также - найти Ассемблер и Редактор
связей объектных модулей, изготовленных таким Ассемблером,
хотя, такие системные обрабатывающие программы явно должны
входить в сам - неотъемлемый набор обрабатывающих программ
каждой операционной системы, в том числе и 64-разрядной.
Это оставляет устойчивое впечатление о том, что Майкрософт
не желает - осознанно или нет, сотрудничать, ещё с другими
разработчиками - системного программного обеспечения, хотя
бы, в области обрабатывающих программ - трансляторов, с их
кодогенераторами - на уровне машинного кода - загрузочного
исполняемого модуля - EXE - для операционной системы.
По структуре такого модуля, имеется только приблизительная
информация и некоторые служебные программы, и трудно иметь
полную исчерпывающую информацию и необходимые руководства.
Это заставляет искать другие выходы из создавшегося сейчас
положения в области программирования - на фундаментальном,
машинном уровне, который всегда привлекал - и возможностью
создания быстродействующих программ и компактных модулей.
***
