Почему 32-битные регистры делятся на 4 части? - PullRequest
1 голос
/ 23 октября 2011

Я изучаю регистры. Похоже, что 32-битные регистры разделены, так что они могут быть доступны как 8-битные регистры. Это выглядит очень неэффективно. Производительность будет улучшена, если они этого не сделают. Так почему они это делают?

Кроме того, стоит потратить дополнительные деньги на их разработку. Почему бы не сделать процессор дешевле, не делая этого?

Ответы [ 4 ]

2 голосов
/ 15 ноября 2012

Intel 8080, который был первым «основным» микропроцессором, имел семь основных 8-битных регистров (A, B, C, D, E, H и L). Поскольку адреса памяти были 16 битами, инструкции, которые должны были использовать непостоянный операнд памяти, использовали бы пару регистров (чаще всего H и L, но иногда B и C или D и E) для формирования адреса. Поскольку регистры в вышеупомянутых парах часто использовались вместе для представления 16-битных значений, было несколько инструкций, которые могли бы работать с парами регистров как 16-битные величины. Инструкция по добавлению BC в HL будет выполнять сложение путем добавления C к L, а затем путем добавления B к H (плюс перенос, если необходимо). Я недостаточно знаком с 4004 или 8008 (двумя предшественниками 8080), чтобы знать, делал ли кто-либо из них что-то похожее по своей архитектуре.

Когда Intel выпустила 8088, они включили 16-разрядный арифметический модуль, но хотели, чтобы код, написанный для 8080, был легко преобразован в их новую архитектуру. На 8080 большая часть кода была написана для «ручного» формирования адресов из 8-битных частей, поскольку это часто выполнялось намного быстрее, чем использование 16-битных инструкций для выполнения математических вычислений. Например, если нужно получить доступ к некоторой указанной таблице из 256 записей с индексом, хранящимся в A, можно было бы сделать что-то вроде (нотация Zilog покажите, но у 8080 были те же инструкции):

ld   hl,(baseOfTable) ; 16-bit address
ld   c,a
ld   b,#0
add  hl,bc
ld   a,(hl)

но если бы можно было убедиться, что таблица выровнена по границе 256 байт, можно значительно упростить код:

ld   l,a
ld   a,(tableBaseMSB) ; Just load the MSB--assume the LSB is zero
ld   h,a
ld   a,(hl)

С набором инструкций 8088 было бы ужасно часто бесполезно для кода, написанного «с нуля», отдельно обращаться к верхней и нижней частям регистров, но для 8080 было написано много кода, который использовал такие методы. и Intel хотела, чтобы люди могли легко конвертировать такой код для использования на 8088. В этом отношении было полезно создать регистры из 8-битных фрагментов.

Кстати, у архитектуры Intel было еще одно преимущество: поскольку она включала четыре 16-разрядных регистра и четыре регистра, которые можно было использовать как одну 16-разрядную или две 8-разрядные части, это позволило сохранить код 12 значений в регистрах, если восемь из них были 255 или меньше, или одиннадцать значений, если шесть из них были 256 или меньше, и т. Д. При использовании архитектур с большим количеством регистров выбор дополнительного регистра здесь и там не так уж важен, но на 8088 это часто было очень полезно.

2 голосов
/ 23 октября 2011

Поскольку, если вы имеете дело только с 8-битными значениями, было бы неэффективно выдавать все битовые маски, чтобы ограничить эти 32/64-битные регистры только 8-битными, над которыми вы работаете.

Итак, x86 регистры имеют

AH/AL = high/low 8bits of a 16bit register
AX = whole 16bit register
EAX = whole 32bit register

С точки зрения размера инструкции гораздо эффективнее иметь

mov ah, 0xXX   (2 bytes)

вместо принудительного

mov ax, 0x00XX  (3 bytes)
mov eax, 0x000000XX  (7 bytes)

Что касается «разработки процессора, чтобы сделать его дешевле», - это для обратной совместимости. Все современные процессоры x86 на самом деле являются разработкой RISC, причем основной кусок кремния предназначен для приема инструкций x86 и преобразования их в собственные внутренние микрооперации ЦП (которые по сути являются набором команд RISC).

1 голос
/ 03 ноября 2011

Обратная совместимость. Производители процессоров не хотели нарушать совместимость со старым программным обеспечением. Это основная причина, по которой процессоры x86_64 по-прежнему поддерживают 16-битное программное обеспечение (виртуальный режим). Если вы внимательно посмотрите, вы увидите, что большинство функций в архитектуре x86 определяются проблемами совместимости. Я не ненавижу.

1 голос
/ 23 октября 2011

Возможность адресации частей регистров не влияет на их производительность при использовании в качестве 32-битных регистров.В этом случае эта возможность просто не используется.

ЦП, независимо от их собственного размера в битах, очень и очень часто манипулируют 8-битными значениями.Например, строки текста часто обрабатываются как последовательные 8-битные значения.Международные наборы символов часто обрабатываются как наборы последовательных 16-битных значений.Поэтому возможность быстрой работы с 8-битными и 16-битными значениями имеет огромное значение.

Если вы на практике спрашиваете о процессорах x86, уже слишком поздно.Самые первые процессоры ПК даже не имели 32-битных регистров, и совместимость сохранялась на всем протяжении.

...