Почему так мало РОН в x86

Тема в разделе "WASM.BEGINNERS", создана пользователем igrock, 5 мар 2008.

  1. igrock

    igrock New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2008
    Сообщения:
    29
    Почему в проце так мало регистров общего назначения, чем это обусловлено, смотря ассемблерные листинги
    удивляешся как компилятор обходится таким количеством, постоянно пересылая значения из памяти в регистр и обратно пытаясь ускорить работу сними, ведь если добавить десяток аккумуляторов все вычисления над переменными можно выполнять в регистрах, не используя доступ к медленной памяти.

    P.S Возможно ли большее кол-во регистров технически, или надо сказать интелловцам спасибо хоть за этот набор регистров?

    P.P.S сорри за бестолковый вопрос :)
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Изначально регистры были не совсем общего назначения: ax - аккумулятор, bx - базовый, для функций типа xlat, cx - счетчик, dx - для данных, si, di - для строковых операций и т.д. И этим набором вполне ограничивались. Ну а сейчас, в начале эпохи 64-битных процессоров, в них (в процессорах x64) уже и появляются дополнительные регистры r9 там, r8...
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Внутренних регистров больше, чем доступных программно. В х64, вот, открыли ещё 8.


    Если хочется фана, посмотри в сторону Itanium:
    The Itanium has a large number of registers:
    * 128 integer registers, each with a NaT bit (r0 - r127)
    * 128 floating-point registers (f0 - f127)
    * 64 predicate registers (p0 - p63)
    * 8 branch registers (b0 - b7)
    * An instruction pointer (the debugger calls this iip)
    * 128 other special-purpose registers (not all of which have yet been given meanings). These are called the "application register set," or "ar" registers. (They are not covered in this documentation.)
    * A number of miscellaneous registers
     
  4. igrock

    igrock New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2008
    Сообщения:
    29
    Значит это директивы типа .386 как раз и ограничивают компилятор только регистрами РОН, а то судя по асм-листингу он доп. регистры не юзает.
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    igrock
    Нет, они Не доступны Программно. Хоть .all_registers_for_all_machines поставь - ничего не выйдет.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Реализовать в железе большое число регистров не проблема. Проблема в их адресации в существующей системе команд х86. Для адресации одного из 8 регистров требуется 3 бита, в одной команде может использоваться до 3-х регистров - итого до 9 бит, которые в зависимости от команды и типа адресации "рассовываются" в забитые под завязку байты опкода, ModR\M и SIB. Поэтому в x86-64 ради адресации дополнительных 8 регистров пришлось пожертвовать популярными однобайтовыми командами inc\dec, которые в 64-битном режиме играют роль префиксов REX и ... могут приводить к заметному увеличению объема кода при злоупотреблении дополнительными регистрами ;)

    От необходимости доступа к медленному ОЗУ никакие регистры не спасут, а часто используемые, "сверхоперативные" данные хранятся в кэше первого уровня со временем доступа 2-3 такта.
    Резюме: для большинства задач доступных РОН вполне хватает, ну а начинающим "танцорам" всегда что-то мешает и не хватает для полного счастья :lol:

    Доп.регистры можно юзать только в 64-битном режиме (т.е. и проц, и компилер и ОС, под которой будет запускаться прога, д.б. 64-битными)
     
  7. igrock

    igrock New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2008
    Сообщения:
    29
    Спасибо за содержательный ответ, теперь кое-что прояснилось :)
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в risc системах куча регистров, но работа с памятью идет только через регистры, за исключением спец команд загрузки в/из памяти.
    то есть что-то типа mov eax, [0x10000] не прокатит.
     
  9. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    igrock
    Главная проблема не в том, что регистров мало, а в том, что они имеют узкую специализацию, о чём уже писали.

    Например, в PDP-11 (была такая мини-ЭВМ, суперпопулярная в 1970-е, отдельные экземпляры до сих пор работают) тоже 8 регистров, из коих один -- указатель стека (SP), а ещё один -- счётчик команд (PC, аналог IP). То есть фактически свободными были всего 6 регистров -- на 1 меньше, чем на интеловских процах. Но они были действительно универсальными, а кроме того, имелась очень удобная система адресации -- и в результате никаких проблем не было.

    Ну а вообще, интеловская архитектура (что 8-разрядный 8080, что 16-разрядный 8086/8088, что 32-разрядные, начиная с 80386) -- это сплошное уродство... Жаль, что нынешним программистам приходится учить ассемблер на таком дерьме :dntknw:((
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    где-то слышал что система команд pdp-11 считается очень хорошей и гораздо лучше существующих, увы сам не работал, а сейчас уже не актуально.
     
  11. igrock

    igrock New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2008
    Сообщения:
    29
    помню набирал команды на каком то PDP (наверное pdp-8) размером с 2 холодильника :) еще до изучения ассемблера, чесно скажу очень понравилось щелкать рычажками ;P да, именно на таких МАШИНАХ и надо начинать изучать ассемблер, остальное от лукавого :)

    P.S. кстати о том что все хвалят архитектуру pdp тоже слышал, видимо действительно легендарная машина была, та же Unix зародилась именно на pdp-шках.
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    n0name

    Из 16-разрядных -- лучшая. За счёт очень гибкой адресации, например, нет нужды в командах PUSH/POP, их роль выполняет MOV. Например, вот сохранение регистра R0 в стеке:

    Код (Text):
    1. MOV   R0, -(SP)
    Пересылка строк байтов примерно так будет (R0 - счётчик, R1 - адрес источника, R2 - адрес приёмника):

    Код (Text):
    1. 10$:   MOVB  (R1)+,(R2)+
    2.        SOB   R0, 10$
    Регистры абсолютно равноправны, за исключением спецфункций регистров 6 и 7 -- указателя стека и счётчика команд соответственно (представляете, как я мучился, переходя на ассемблер 8086 с его узкой специализацией регистров?). Почти все арифметико-логические операции можно выполнять как с операндами в регистрах, так и в памяти, т.е. регистры обязательны только для косвенной адресации. В общем, достоинств, масса, хотя недостатки тоже имеются.

    Ну а среди 32-разрядных машин лучшая по системе команд -- VAX-11, которая стала развитием PDP-11.
     
  13. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    Так, не пойму в чем уродство архитектуры Intel. Пожалуйста - подробный и усчерпывающий список доводов. Далее - не вижу не равноправность регистров. ESP есть как вы сказали и других. PUSH/POP можно также заменить MOV/ADD(SUB), кто мешает(другое дело скорость и/или размер кода)? Да, некоторые многие команды используют неявно многие регистры, но никто не запрещает нам ими пользоватся не забывая конечно об этих неявных зависимостях. А вообще все что пахнет линуксом у меня вызывает рвотный рефлекс.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    мм. я согласен что формат команд корявый. например как интересно вводится доп байт сиба, или то что некоторые регистры не могут быть индексом или базой, итд.
    посмотри 16битный режим.
     
  15. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    в абсолютном отсутствии масштабируемости.

    P.S. не хватает нескольких необходимых инструкций (например "ADD+MUL", "сдвиг+вставка").
     
  16. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    ну ясно как - по опкоду. но ведь помоему все это вылевается в преимущество кода в размере - все изза неоднозначной структуры опкода, иначе изза чоткой структуры имели бы кучу (по сравнению с текущей организацией кодирования инструкций) байт для каждого опкода.
     
  17. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    совершенно с этим не согласен. почему это они должны быть одной инструкцией? ну линукс влияет, понимаю +)
     
  18. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    EvilPhreak
    Начну с конца. Да, Unix фактически появилась на PDP-11 (именно на этой машине она была написана на Си), но работала преотстойно: тормозила жутко и всё такое прочее. По сравнению, есно, с нормальными осями, "заточенными" под эту машину и написанными на асме -- в частности, RSX-11M и RT-11. Не хватало ни скорости процессора, ни объёма памяти (PDP-11 -- мини-ЭВМ, а не мэйнфрейм), чтобы тянуть ось, написанную на ЯВУ.

    1) Узкая специализация ВСЕХ так называемых "регистров общего назначения". Например:

    а) в командах умножения и деления задействованы регистры AX и DX, заменить их другими регистрами невозможно;

    б) в строковых операциях задействованы регистры SI и DI;

    в) в инструкции организации цикла, в операциях многоразрядного сдвига и в префиксах повторения задействован регистр CX;

    г) косвенная адресация возможна только с использованием регистров SI, DI, BX и BP.

    Ну и так далее и тому подобное.

    2) "Неортогональность" системы команд, то есть неодинаковые режимы адресации, доступные для операндов разных команд (наиболее широкий выбор у MOV, а вот у тех же умножения-деления -- куда меньше).

    3) Запутанная схема кодирования команд.

    4) Целый набор ляпов при реализации защищённого режима, из-за чего в защищённом режиме 80286 невозможно было выполнять программы, написанные для 8086, а до появления специальных технологий виртуализации невозможно было реализовать нормальную систему виртуальных машин (возможна была только эмуляция, что связано с огромным падением производительности).

    5) Ляпы с совместимостью снизу вверх, которой в полном объёме нет, хотя никаких реальных причин не сделать её не было (разница в команде PUSHA, в командах сдвига, ещё в чём-то там).

    n0name
    Так и в 32-разрядном равноправности нет. Кой-что смягчили, но в общем то же самое и осталось.

    EvilPhreak
    Реальных преимуществ это не даёт. У той же PDP-11 все команды были 2-, 4- или 6-байтовыми (все операции "регистр-регистр" -- двухбайтовые). Да, какие-то операции получались в результате несколько длиннее, но суммарный размер программ оказывался меньше (особенно с учётом равноправия регистров, из-за чего их не приходилось постоянно запихивать в стек и извлекать их оттуда). Кроме того, чёткая схема кодирования команд резко упрощает их выборку из памяти и декодирование, а это прямо сказывается на сложности и производительности процессора.
     
  19. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    EvilPhreak
    Причём здесь линукс, лично мне неясно. Правда, я не соглашусь, что это необходимые инструкции, но в определённых задачах (например, обработки изображений или оцифрованных аналоговых сигналов) чрезвычайно полезные.