Целью 8088/8086 было предоставить средство, с помощью которого 16-разрядный процессор мог бы иметь адресное пространство в 1 мегабайт, при этом программистам не приходилось бы делить адресное пространство на куски по 64 КБ и беспокоиться о том, пересекают ли адреса границымежду ними.Несмотря на то, что он был сильно порочен, на самом деле он лучше, чем любой другой подход, который я видел для работы с адресами, размер которых превышает размер регистра.Это часто работает относительно легко в тех случаях, когда данные естественным образом подразделяются на элементы размером 64 КБ или меньше, и когда допустимо начинать элементы, начиная с 16-байтовых границ.Умножение на 16 (вместо некоторого большего или меньшего числа) было, вероятно, произвольным, но оно удобно работает при перечислении вещей в шестнадцатеричной записи, и это был хороший компромисс между использованием двух небольших чисел (что ограничило бы адресное пространство дополовина мегабайта или меньше) или слишком большое число (для этого потребовалось бы больше кода, чтобы либо справиться с произвольными смещениями для выделенных блоков, либо тратить больше блоков заполнения памяти на большее кратное число).
Единственный основнойНедостатки в конструкции сегментации 8088, на самом деле, таковы:
- Двух регистров сегментации общего назначения недостаточно "достаточно".Распространенным шаблоном является «копирование данных из одного объекта в другой объект с использованием третьего объекта для его перевода»;этот шаблон может быть эффективно реализован, только если один из объектов находится либо в сегменте кода, либо в стеке.К сожалению, это не было исправлено до 80386 года, где обычной практикой было игнорировать сегменты.
- Не было никакого хорошего способа сделать какую-либо арифметику на сегментных регистрах.Инструкции по добавлению или вычитанию 0x1000 из DS или ES (или FS или GS), либо если перенос был установлен, либо безоговорочно - всего восемь (или шестнадцать) кодов операций - значительно облегчили бы обработку сегментов.
- Должны были быть инструкции "mov seg, немедленные".
Несмотря на то, что программисты часто ворчали о 8088/8086 в те времена, это было намного лучше, чем у любого другого 16-битного процессора, который я видел тогда или с тех пор (примечание: 68000 я считаю 32-битнымпроцессор).