Почему нет регистра, который содержит старшие байты EAX?

StackOverflow https://stackoverflow.com/questions/228200

  •  03-07-2019
  •  | 
  •  

Вопрос

% AX = (% AH +% AL)

Так почему бы не % EAX = (% SOME_REGISTER +% AX) для какого-либо регистра % SOME_REGISTER ?

Это было полезно?

Решение

Просто для пояснения. В первые дни микропроцессоров 1970-х годов процессоры имели только небольшое количество регистров и очень ограниченный набор команд. Как правило, арифметическое устройство может работать только с одним регистром ЦП, часто называемым «аккумулятором». Аккумулятор на 8 бит 8080 & amp; Процессоры Z80 назывались «А». Было 6 других 8-битовых регистров общего назначения: B, C, D, E, H & amp; L. Эти шесть регистров могут быть объединены в пару из 3 16-битных регистров: BC, DE & amp; Гектолитр Внутренне аккумулятор был объединен с регистром флагов для формирования 16-битного регистра AF.

Когда Intel разработала семейство 16-битных 8086, они хотели иметь возможность переносить код 8080, поэтому они сохранили ту же базовую структуру регистров:

8080/Z80  8086
A         AX
BC        BX
DE        CX
HL        DX
IX        SI    
IY        DI

Из-за необходимости переноса 8-битного кода им нужно было иметь возможность ссылаться на отдельные 8-битные части AX, BX, CX & amp; DX. Они называются AL, AH для низких & amp; старшие байты AX и т. д. для BL / BH, CL / CH & amp; DL / DH. IX & amp; IY на Z80 использовались только как 16-битные регистры-указатели, поэтому не было необходимости обращаться к двум половинкам SI & amp; DI.

Когда 80386 был выпущен в середине 1980-х годов, они создали "расширенный" версии всех регистров. Таким образом, AX стал EAX, BX стал EBX и т. Д. Не было необходимости доступа к верхним 16 битам этих новых расширенных регистров, поэтому они не создавали псевдорегир EAXH.

AMD применила тот же трюк, когда выпустила первые 64-битные процессоры. 64-битная версия регистра AX называется RAX. Итак, теперь у вас есть что-то похожее на это:

|63..32|31..16|15-8|7-0|
               |AH.|AL.|
               |AX.....|
       |EAX............|
|RAX...................|

Другие советы

Здесь опубликовано много ответов, но ни один из них не отвечает на данный вопрос: почему нет регистра, который непосредственно кодирует старшие 16 бит EAX или старшие 32 бита RAX? Ответ сводится к ограничениям самой кодировки инструкции x86.

16-разрядный урок истории

Когда Intel разработала 8086, они использовали схему кодирования переменной длины для многих инструкций. Это означало, что некоторые чрезвычайно распространенные инструкции, такие как POP AX , могут быть представлены в виде одного байта (58), в то время как редкие (но все еще потенциально полезные) инструкции, такие как MOV CX, [BX * 4 + BP + 1023] можно по-прежнему представлять, даже если для их сохранения требуется несколько байтов (в этом примере 8B 8C FF 03).

Это может показаться разумным решением, но когда они его разработали, они заполнили большую часть доступного пространства . Так, например, было восемь инструкций POP для восьми отдельных регистров (AX, CX, DX, BX, SP, BP, SI, DI), и они заполнили коды операций с 58 по 5F, и Опкод 60 был совсем другим ( PUSHA ), как и опкод 57 ( PUSH DI ). Там нет места для чего-либо после или до тех пор. Даже нажатие и извлечение регистров сегмента & # 8212; что концептуально почти идентично нажатию и извлечению регистров общего назначения & # 8212; должен был быть закодирован в другом месте (около 06 / 0E / 16 / 1E) только потому, что рядом с остальными инструкциями push / pop не было места.

Аналогично, "mod r / m" байт, используемый для сложной инструкции, такой как MOV CX, [BX * 4 + BP + 1023] имеет только три бита для кодирования регистра, что означает, что он может представлять всего восемь регистров. Это хорошо, если у вас есть только восемь регистров, но это представляет реальную проблему, если вы хотите иметь больше.

(Здесь есть превосходная карта всех этих распределений байтов в архитектуре x86: http://i.imgur.com/xfeWv .png . Обратите внимание, что на основной карте не осталось места, некоторые инструкции перекрывают байты, и даже сколько вторичной карты "0F" используется теперь благодаря инструкциям MMX и SSE.)

К 32 и 64 битам

Таким образом, даже для того, чтобы дизайн ЦП был расширен с 16 до 32 бит, у них уже была проблема проектирования, и они решили ее с помощью префиксных байтов : добавив специальный " 66 " Байт перед всеми стандартными 16-битными инструкциями, процессор знает, что вам нужна та же инструкция, но 32-битная версия (EAX) вместо 16-битной версии (AX). Остальная часть проекта осталась прежней: в общей архитектуре ЦП все еще было всего восемь регистров общего назначения.

Подобные хакеры нужно было сделать, чтобы расширить архитектуру до 64-битных (RAX и друзья); там проблема была решена путем добавления еще одного набора префиксных кодов ( REX , 40-4F), что означало «64-битный»; (и фактически добавил еще два бита в поле «mod r / m»), а также отбросил странные старые инструкции, которые никто никогда не использовал, и повторно использовал их байт-коды для более новых вещей.

В стороне от 8-битных регистров

Один из самых больших вопросов, который следует задать, заключается в том, как, черт возьми, такие вещи, как AH и AL, работали вообще, если в проекте действительно есть место только для восьми регистров. Первая часть ответа заключается в том, что не существует такой вещи, как " PUSH AL " & # 8212; некоторые инструкции просто не могут работать с байтовыми регистрами вообще! Единственными возможными являются некоторые особые странности (такие как AAD и XLAT ) и специальные версии " mod r / m " инструкции: наличие очень специфического бита, перевернутого в «mod r / m»; байт, эти "расширенные инструкции" может быть перевернут, чтобы оперировать

В старые 8-битные времена существовал регистр А.

В 16-битные дни существовал 16-битный регистр AX, который был разделен на две 8-битные части, AH и AL, для тех случаев, когда вы все еще хотели работать с 8-битными значениями.

В 32-разрядные дни был введен 32-разрядный регистр EAX, но все регистры AX, AH и AL были сохранены. Разработчики не сочли необходимым вводить новый 16-битный регистр, который адресовал биты с 16 по 31 в EAX.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top