вторник, 9 декабря 2008 г.

Почему у процессоров x86 так мало регистров?

Это перевод Why does the x86 have so few registers?. Автор: Реймонд Чен.

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

Процессор 8086 был просто 16-ти битной версией ещё более старого процессора 8080, который имел семь восьмибитовых регистров с именами A, B, C, D, E, H и L. Регистры могли использоваться парами для создания трёх 16-ти битных псевдо-регистров BC, DE и HL. Но это ещё не всё: вы могли положить 16-ти битный адрес в регистр HL и использовать псевдо-регистр "M" для его разыменования. Поэтому, например, вы могли написать "MOV B, M" и это означало бы загрузку в регистр B 8-ми битного значения, на которое указывает адрес, записанный в HL.

Процессор 8086 брал регистры 8080-го и маппил их примерно так:
  • A -> AL
  • H -> BH, L -> BL; HL -> BX; M -> [BX]
  • B -> CH, C -> CL; BC -> CX
  • D -> DH, E -> DL; DE -> DX
Именно поэтому с набором инструкций 8086 вы можете разыменовывать указатель только используя регистр [BX], но не [CX] или [DX]: в оригинальном 8080 вы не могли использовать для этого [BC] или [DE], а только M=[HL].

До сих пор это всё были довольно официальные слова. Набор инструкций для 8086 был выбран обратно совместимым с 8080, что способствовало переходу существующего 8-ми битного кода на 16-ти битный процессор. Даже вызовы функций MS-DOS были спроектированы, чтобы упростить машинный переход.

Что насчёт регистров SI и DI? Я подозреваю, что их идея возникла из регистров IX и IY машины Z-80 - конкурента 8080, который взял набор инструкций 8080 и расширил его новыми регистрами. Z-80 позволял вам разыменовывать указатель через [IX] и [IY], поэтому 8086 позволял вам разыменовывать через [SI] и [DI].

А что насчёт регистра BP? Я подозреваю, что его изобрели в процессе проектирования, чтобы упростить передачу параметров через стек. Заметьте, что регистр BP - единственный из регистров 8086, который привязан к сегменту SS и, следовательно, может использоваться для доступа к памяти стека напрямую.

Почему нельзя было добавить ещё больше регистров, как, например, делают современные процессоры с их палитрой из 16-ти или даже 128-ю регистров? Зачем нужно было ограничивать 8086 только восемью регистрами (AX, BX, CX, DX, SI, DI, BP, SP)? Ну, тогда - это тогда, а сейчас - это сейчас. В те времена процессоры не имели много регистров. Например, 68000 имел целых 16 регистров, но если вы посмотрите на них более внимательно, то увидите, что только одна половина из них может использоваться в арифметических операциях, а вторая половина - только для доступа к памяти.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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