Почему x86 уродлив? Почему он считается низшим по сравнению с другими?

Я читал некоторые архивы SO и встречал заявления против архитектуры x86.

и многие другие комментарии, такие как

Пробовал искать, но причин не нашел. Я не нахожу x86 плохим, вероятно, потому, что это единственная архитектура, с которой я знаком.

Может ли кто-нибудь дать мне основания считать x86 уродливым/плохим/неполноценным по сравнению с другими.


person claws    schedule 21.04.2010    source источник
comment
Я выбираю S&A на основе полученных ответов, но попутно отмечу, что CISC не является проблемой для набора инструкций m68k. x86 - это то, что есть, и вы можете оставить его.   -  person dmckee --- ex-moderator kitten    schedule 21.04.2010
comment
что такое С&А? CISC не является проблемой для набора инструкций m68k. -- Почему бы нет?   -  person claws    schedule 21.04.2010
comment
Микросхемы Motorala серии 68000 имеют архитектуру с высоким уровнем CISC, но они имеют однородный, достаточно ортогональный и очень простой набор инструкций. В чем отличие от x86? Я не знаю. Но обратите внимание, что существует большая разница между сложностью чипа и сложностью набора инструкций (то есть интерфейса, который видит программист на ассемблере).   -  person dmckee --- ex-moderator kitten    schedule 21.04.2010
comment
+1: за провокационный заголовок, но с действительно интересным вопросом :)   -  person Juliet    schedule 22.04.2010
comment
+1 за очень интересный вопрос.   -  person Turing Complete    schedule 30.06.2010
comment
Потому что это просто общеизвестно, вам не нужны доказательства или статьи об этом. (ржу не могу)   -  person v.oddou    schedule 20.03.2014
comment
Недавнее исследование энергоэффективности различных процессоров, найденное здесь, с хорошим обсуждением того, что привело к разработке CISC и RISC. extremetech.com/extreme/   -  person    schedule 23.10.2014
comment
Ваша вторая ссылка битая   -  person ebrohman    schedule 21.11.2015


Ответы (10)


Пара возможных причин:

  1. x86 — это относительно старая ISA (в конце концов, ее предшественниками были 8086)
  2. x86 значительно эволюционировал несколько раз, но для обеспечения обратной совместимости со старыми двоичными файлами требуется аппаратное обеспечение. Например, современное оборудование x86 по-прежнему поддерживает работу с 16-битным кодом. Кроме того, существует несколько моделей адресации памяти, позволяющих более старому коду взаимодействовать на одном и том же процессоре, например реальный режим, защищенный режим, виртуальный режим 8086 и длинный режим (amd64). Некоторых это может сбить с толку.
  3. x86 - это машина CISC. Долгое время это означало, что он был медленнее, чем RISC-машины, такие как MIPS или ARM, потому что инструкции имеют взаимозависимость данных и флаги, что делает большинство формы параллелизма на уровне инструкций трудно реализовать. Современные реализации переводят инструкции x86 в RISC-подобные инструкции, называемые "micro-ops" под обложки, чтобы сделать эти виды оптимизации практичными для аппаратной реализации.
  4. В некоторых отношениях x86 не уступает, он просто другой. Например, ввод/вывод обрабатывается как отображение памяти на подавляющем большинстве архитектур, но не на x86. (Примечание: современные машины x86 обычно имеют ту или иную форму поддержки DMA и взаимодействуют с другим оборудованием через память. сопоставление; но ISA по-прежнему имеет инструкции ввода-вывода, такие как IN и OUT)
  5. x86 ISA имеет очень мало архитектурных регистров, что может заставить программы выполнять циклический обход памяти чаще. чаще, чем это было бы необходимо. Дополнительные инструкции, необходимые для этого, требуют ресурсов выполнения, которые можно было бы потратить на полезную работу, хотя эффективная переадресация хранилища снижает задержку. Современные реализации с переименованием регистров в большой файл физических регистров могут поддерживать выполнение многих инструкций, но отсутствие архитектурных регистров по-прежнему было существенным недостатком 32-разрядной архитектуры x86. Увеличение x86-64 с 8 до 16 целочисленных и векторных регистров является одним из самых важных факторов в том, что 64-битный код работает быстрее, чем 32-битный (наряду с более эффективным ABI-вызовом регистров), а не увеличенной шириной каждого регистра. Некоторым помогло бы дальнейшее увеличение числа регистров с 16 до 32, но не так сильно. (Однако AVX512 увеличивает число векторных регистров до 32, поскольку код с плавающей запятой имеет более высокую задержку и часто требует большего количества констант.) (см. комментарий)
  6. Ассемблерный код x86 сложен, потому что x86 — это сложная архитектура с множеством функций. Список инструкций для типичной машины MIPS умещается на листе бумаги размером с одну букву. Эквивалентный листинг для x86 занимает несколько страниц, а инструкции просто делают больше, поэтому вам часто требуется более подробное объяснение того, что они делают, чем может дать листинг. Например, MOVSB инструкции требуется относительно большой блок кода C, чтобы описать, что оно делает:

    if (DF==0) 
      *(byte*)DI++ = *(byte*)SI++; 
    else 
      *(byte*)DI-- = *(byte*)SI--;
    

    Это одна инструкция, выполняющая загрузку, сохранение и две операции сложения или вычитания (управляемые вводом флага), каждая из которых будет отдельной инструкцией на RISC-машине.

    Хотя простота MIPS (и подобных архитектур) не обязательно делает их превосходными, для обучения введению в класс ассемблера имеет смысл начать с более простого ISA. На некоторых занятиях по ассемблеру преподается сверхупрощенное подмножество x86, называемое y86, которое настолько упрощено, что не является полезно для реального использования (например, без инструкций сдвига), или некоторые обучают только основным инструкциям x86.

  7. В x86 используются операционные коды переменной длины, которые усложняют аппаратное обеспечение в отношении разбора инструкций. В современную эпоху эта стоимость становится исчезающе малой, поскольку процессоры все больше и больше ограничиваются пропускной способностью памяти, а не необработанными вычислениями, но многие статьи и мнения, посвященные критике x86, исходят из эпохи, когда эта стоимость была сравнительно намного выше.
    Обновить 2016 г.: Anandtech опубликовала обсуждение размеров кода операции для x64 и AArch64.

РЕДАКТИРОВАТЬ: Это не должна быть вечеринка bash the x86!. У меня не было другого выбора, кроме как немного поиздеваться над тем, как сформулирован вопрос. Но за исключением (1) все эти вещи были сделаны по уважительным причинам (см. комментарии). Разработчики Intel не глупы — они хотели чего-то достичь с помощью своей архитектуры, и вот некоторые налоги, которые им пришлось заплатить, чтобы воплотить эти цели в жизнь.

person Billy ONeal    schedule 21.04.2010
comment
Я вижу, что коды операций переменной длины являются источником силы, поскольку машинный код x86 имеет тенденцию занимать меньше места, чем, например, код PowerPC. Я могу ошибаться. - person Joey Adams; 21.04.2010
comment
Это компромисс. Преимущество в том, что размер двоичного файла может быть меньше, но недостаток в том, что вам нужно иметь очень сложное оборудование для реализации синтаксического анализатора для этих инструкций. Подавляющее большинство инструкций в любом случае имеют одинаковый размер - большая часть кода операции переменной длины на x86 связана с тем, что они решили добавить функции и обнаружили, что не могут представить то, что они хотели, в количестве битов, с которыми они должны были работать. . Подавляющее большинство людей не столько заботит размер двоичного файла, сколько сложность аппаратного обеспечения или энергопотребление. - person Billy ONeal; 21.04.2010
comment
@Joey Adams: Сравните инструкции переменной длины x86 с режимом большого пальца ARM ( en.wikipedia.org/ wiki/ARM_architecture#Thumb ). Режим большого пальца приводит к значительно меньшему объектному коду для ARM, поскольку более короткие инструкции отображаются непосредственно на обычные инструкции. Но поскольку между более крупными инструкциями и более мелкими имеется отображение 1:1, аппаратное обеспечение синтаксического анализа легко реализовать. Инструкции переменной длины x86 не имеют этих преимуществ, потому что они изначально не были разработаны таким образом. - person Billy ONeal; 21.04.2010
comment
(7) В x86 используются коды операций переменной длины, которые усложняют аппаратную часть синтаксического анализа инструкций — это больше проблема для разработчиков компиляторов и тех, кто пишет самомодифицирующийся код. Аппаратное обеспечение не дает дерьмо. - person Chris K; 21.04.2010
comment
(6) Не каждый код операции должен использоваться каждой программой, но, черт возьми, когда мне нужен SSE3, я рад, что он у меня есть. - person Chris K; 21.04.2010
comment
@claws: Это не совсем то, что нужно читать таким образом - почти все, что я перечислил выше (кроме № 1), является компромиссом. Например, № 2 и № 7 предназначены для обеспечения обратной совместимости с существующим кодом. Это несомненный +. № 3 просто другой, нет ни выигрыша, ни проигрыша. #4 означает, что для тех, кто знает, что делает, написание ассемблера вручную может быть значительно проще. # 5 является следствием наличия CISC и в настоящее время не имеет большого значения на практике. № 6 означает, что процессор выполняет больше работы для программиста на ассемблере — опять же, компромисс. Не может быть всего. - person Billy ONeal; 21.04.2010
comment
@Chris Kaminski: Как это не влияет на оборудование? Конечно, на современном полноразмерном компьютере никого не будет волновать, но если я делаю что-то вроде сотового телефона, меня больше волнует энергопотребление, чем что-либо еще. Коды операций переменной длины не увеличивают время выполнения, но для работы оборудования декодирования по-прежнему требуется питание. - person Billy ONeal; 21.04.2010
comment
У меня никогда не было возможности профессионально проектировать микросхемы, но у меня была возможность придумывать процедуры, обеспечивающие работу процессоров. Мне еще предстоит понять, насколько сложнее аппаратные наборы инструкций переменной длины. Я всегда думал, что сложность имеет большее значение для задачи дизайнера и количества модульных ячеек, от которых приходится отказываться. Я никогда не думал, что такая сложность сильно усложняет работу процессора. - person Blessed Geek; 21.04.2010
comment
@Billy ONeal: я не говорю, что это не может быть лучше - просто люди, жалующиеся на то, насколько ужасен x86, являются авторами компиляторов. Те (я думаю) с законной говядиной были авторами ОС в начале 90-х и всей путаницей с защищенным режимом (а затем с PAE). Я рад, что AMD наконец заставила Intel увидеть 64-битный свет. - person Chris K; 21.04.2010
comment
@ Крис: Согласен. Я не пытаюсь ругать x86. Просто цитирую некоторые вещи, за которые люди обычно ругают его. - person Billy ONeal; 22.04.2010
comment
@Billy ONeal: И вы пропустили самое главное — все эти чертовы модели памяти! - person Chris K; 22.04.2010
comment
(3) Разве DMA не меняет это (а также вводит свою долю НОВЫХ головных болей)? - person Chris K; 22.04.2010
comment
@Chris: Что касается моделей памяти, это часть того, что я имел в виду под (2). Модели памяти изначально не были разработаны таким образом; они являются результатом изменения важных вещей (например, собственного размера слова) и желания поддерживать обратную совместимость с кодом, использующим старую модель. Что касается DMA, да, это меняет ситуацию (например, меняет ситуацию для каждого ЦП), но то же самое относится и к RISC. Однако не все оборудование (например, клавиатура) использует DMA, поэтому различия ввода-вывода x86 все еще живы и здоровы. - person Billy ONeal; 22.04.2010
comment
нарушение совместимости иногда является единственным путем к реальным усовершенствованиям и улучшениям; Единственная причина не делать этого - это то, что я могу назвать кратким маркетингом, и часто это нехорошо (конечно, чтобы увеличить карман некоторых людей, но не для того, чтобы сделать оборудование лучше по-настоящему) - person ShinTakezou; 20.06.2010
comment
@ShinTakezou: Честно говоря, я с вами согласен. Тем не менее, x86 — это тот случай, когда я очень рад, что они оставили все как есть. Мне нравится возможность запускать программное обеспечение, выпущенное 15 лет назад, без модификаций и без сохранения старого оборудования. Количество программного обеспечения, написанного для x86, достаточно велико, чтобы сделать изменение, несовместимое с предыдущими версиями, проблемой. - person Billy ONeal; 21.06.2010
comment
@ Билли, к счастью, существует некоторая эволюция, и аппаратная эмуляция может быть выполнена в программном обеспечении (с помощью некоторых функций современных процессоров, включая виртуализацию), поэтому 15-летнее программное обеспечение может работать, а иногда и быстрее, чем на оригинальном оборудовании; Я думаю, что имея дешевую память, мощные процессоры (еще более мощные, нарушающие обратную совместимость), инновационный аппаратный дизайн (больше асинхронных архитектур?), мы можем запускать старое ПО без модификаций на размещенном виртуальном оборудовании, производительность которого даже выше, чем у реального. Старый. - person ShinTakezou; 21.06.2010
comment
@ShinTakezou: Молодец. Проблема в том, что предлагаемого оборудования не существует. Единственными конкурирующими архитектурами с x86 в настоящее время являются архитектуры RISC, и ни одна из них больше не предлагает лучшую практическую производительность, чем x86. Если вам нужен инновационный аппаратный дизайн, вам следует обратить внимание на вычисления на GPU. Ни один компьютер общего назначения не предлагает лучшую производительность, чем существующие архитектуры. - person Billy ONeal; 21.06.2010
comment
@Billy ONeal, в частности, нам не нужны асинхронные арки: currentbad hw может достаточно плавно запускать эмуляции! Почему они настаивают на совместимости, которая интересует очень мало людей (или никого)? Я не участвую в дебатах x86 (CISC?) против RISC; я участвую в дебатах о том, что более многообещающие и лучшие процессоры/архитектура существовали и могли бы существовать (Intel или что-то еще, это не важно для конечного пользователя, но, к сожалению, именно Intel управляет рынком, и я подозреваю, что, как часто случается, замедление инноваций — это способ максимизировать прибыль, поэтому обещания журналов 70-х странным образом были обмануты). - person ShinTakezou; 21.06.2010
comment
@ShinTakezou: Ваше утверждение о том, что нынешнее оборудование плохое, просто неверно. Если аппаратное обеспечение Intel настолько плохое, то я спрашиваю, почему ни одна другая архитектура не предлагает значительно лучшую производительность. У ARM и ее друзей, безусловно, есть стимул для создания такой платформы, и они производят столько же, если не больше чипов, чем Intel, для таких устройств, как iPod, iPhone и iPad, и других типов встраиваемых устройств, таких как телевизоры. - person Billy ONeal; 21.06.2010
comment
Я намеренно написал плохо, чтобы избежать такого бессмысленного разговора; но я также могу заявить, что это плохо, я слышал, как многие технические специалисты говорили это и пытались объяснить технические моменты, которые я не могу воспроизвести или полностью понять,но меня больше интересует логика в данном случае(если быть точным,надо укрупнить затрагиваемые темы):то,что никакие другие арки не конкурируют на потребительском рынке по производительности,нельзя использовать в качестве аргумента докажите, что текущее оборудование ПК неплохое. (Примечание: я подчеркиваю использование общего hw/arch против архитектуры x86, где люди могут подумать, что я говорю о внутренних компонентах x86) - person ShinTakezou; 21.06.2010
comment
@ShinTakezou: Что конкретно плохого? Какая конкретно существует архитектура, в которой нет таких недостатков? - person Billy ONeal; 21.06.2010
comment
когда были лошади и кто-то говорил о движущихся машинах, люди спрашивали, что не так с лошадьми, пока прототипы не начали получать широкое распространение; другие аппаратные средства могут быть реальностью, просто нет достаточного количества предприятий, чтобы сделать их широко распространенными (на потребительском уровне), поэтому, как уже было сказано, текущий hw определяется рынком (и его насыщением для максимизации прибыли), а не возможностями известной технологии (я думаю, формованием в RD-labs). Из неисторического PoV текущее аппаратное обеспечение ПК в основном такое же, как IBM pc (80-е): более быстрые часы, большие шины и т. д. не являются инновациями (а настоящих инноваций очень мало, если они вообще есть) - person ShinTakezou; 21.06.2010
comment
@ShinTakezou: Когда что-то не меняется, это обычно указывает на то, что что-то изначально было сделано правильно. Если вы не можете указать на случай, когда такое изменение привело к повышению производительности, то ваш аргумент бесполезен. Более того, произошли значительные изменения в работе ПК. Посмотрите на вычисления на графическом процессоре — это значительный отход от модели. Посмотрите на последние чипы от Intel и AMD: у них нет традиционной пары северный/южный мост, которая была стандартной на протяжении многих лет. О каких инновациях вы думаете? - person Billy ONeal; 21.06.2010
comment
Снова логика; обычно ничего не значит; 10 миллионов человек, говорящих неправду, не превращают ее в правду. Нет нужды в 4 ногах больше, чем у вас, поскольку ваш единственный аргумент — это работает/это так, в основном. копр. стар (и уже эксплуатировался раньше), он пойдет дальше, все же он исходит из тумана 70-х / 80-х годов. Если вы перечитаете мою речь, вы заметите, что я говорю, что инновации всегда (Х лет) опаздывают, а не по техническим причинам ;так что неудивительно, что вещи меняются и становятся немного лучше... просто не так быстро, как могли бы. - person ShinTakezou; 21.06.2010
comment
‹‹‹‹(продолжение)поскольку мы достигаем пределов возможностей текущего подхода... мы знали, что это произойдет, но мы все равно продолжили менее инновационный путь. Потому что это почему-то считалось проще, дешевле, что угодно... во всяком случае, как уже было сказано, по экономически-рыночным причинам, а не по строго техническим невозможностям. У меня есть старые журналы, обещающие невероятные вещи через несколько лет... до того, как рынок стал таким важным , замедляя мир. Итак, как уже было сказано, эти возможные обещания были преданы, и мы, мягко говоря, на 10 лет опоздали. - person ShinTakezou; 21.06.2010
comment
@ShinTakezou: Назовите такое обещание, пожалуйста. - person Billy ONeal; 21.06.2010
comment
‹‹‹... и причина этого - максимизация прибыли: если они продавали технологии, которые достигают текущих результатов 10 лет назад, что они могли продать за эти 10 лет...? им пришлось вкладывать больше средств в НИОКР, не поддерживая их продажей чего-либо нового (за исключением неисправностей или старения, хотя все еще достаточно мощного) как нового, заставляя людей обновляться. Так все работает, если быть кратким (!), но это не означает, что это создает лучшие человеческие технологии, которые в настоящее время могут - person ShinTakezou; 21.06.2010
comment
чтобы быть кратким без поиска, представьте, что они говорили о том, что мы можем сделать с компьютерами сегодня, насколько это возможно через несколько лет (журналы за 1980 год или около того), скажем, 1985 год; может быть, оптимистично, поэтому давайте представим, что они говорят, что это будет 2000 год. Они говорили о том, что компьютеры делают сейчас, как о возможном в 1985-1990 годах. Думаю, это была проекция тренда. Вот что обещала технология. Затем дела пошли медленнее, начиная с точки зрения потребителя. Инновационные машины (или машины, пытающиеся быть инновационными) были просто исключены рынком... если не считать того, что они отбираются у них годы спустя и продаются как инновационные. - person ShinTakezou; 21.06.2010
comment
@ShinTakezou: Назовите такое обещание, пожалуйста. Я все еще не видел, чтобы ты написал хоть одно. - person Billy ONeal; 21.06.2010
comment
Обещание - это то, что вы говорите, что это может произойти в ближайшее время, а потом это происходит поздно (или никогда). Обещания некоторых журналов, если вам нужен пример, заключались в том, что я могу запустить трассировщик лучей на сложной сцене и получить результат через 1 час 5 лет или около того. после прочтения; я все еще не могу получить результат на P4 2,8 ГГц 15 лет спустя. Обещания (прогнозы) были настолько неверными? Моя точка зрения - нет: оптимистично, но не так уж неправильно. темпы увеличения разрыва между технологическими усовершенствованиями для увеличения прибыли. И поскольку x86 является доминирующей на рынке аркой, ... выводы остались 2 u - person ShinTakezou; 23.06.2010
comment
@ShinTakezou: Да, проекция была неправильной. Они думали, что будут производить микросхемы и в диапазоне 20 ГГц, пока не начали продвигаться вперед и не обнаружили физических ограничений скорости переключения. - person Billy ONeal; 23.06.2010
comment
нет, физические пределы были достаточно хорошо известны. Они ошибались, так как думали, что если работающая технология будет готова в лаборатории, то на следующий день они смогут начать ее массовое производство. В настоящее время это неправильно. - person ShinTakezou; 23.06.2010
comment
@ShinTakezou: физические ограничения были достаточно хорошо известны ‹-- Правда? Вы ожидаете, что я поверю, что они продвигали десятки ГГц 15 лет назад? Какая еще существует архитектура, в которой эта работающая технология готова в лаборатории? Существует множество процветающих архитектур, в первую очередь PPC (архитектура IBM POWER, прежде всего) и ARM (и различные потомки от ARM Holdings). Тот факт, что архитектура Intel захватила рынок настольных компьютеров, не означает, что Intel — единственная игра в городе. Если бы существовала техническая компания, выполняющая то, что вы предлагаете, будьте уверены, что кто-то вроде IBM или ARM сейчас бы ее продал. - person Billy ONeal; 23.06.2010
comment
пределы того, насколько быстро можно рассеять тепло, выделяемое внутри небольшой площади из-за любого физического процесса, можно было оценить еще до появления микросхем; они знали, что миниатюризация и увеличение скорости переключения налагают ограничения (регулируемые, но не превышающие физического порога, опять же познаваемо, и никому не нужен жидкостный кулер на его рабочем столе, верно?); Тот самый метод, который у вас есть сегодня, скорее всего, это то, что раньше было в лабораториях; я не говорю о таинственных вещах/технологиях , а просто об отрыве от их рабочего существования и их коммерциализации, это имеет большое значение››› - person ShinTakezou; 23.06.2010
comment
Поскольку искусственное увеличение разрыва дает возможность увеличить прибыль, все эти технологические компании (Intel, Motorola, IBM или кто-то еще) проводят свои исследования и разработки и перерабатывают их; не то чтобы они делают это потому, что они извращенцы, скорее всего, у них также нет шансов. ... из-за рынка... Итак, еще раз, мое предыдущее утверждение: рынок, его механизмы и самореферентность замедляют инновации (и увеличивают прибыль, поэтому никто не заинтересован в изменении этих механизмов); так что сейчас на рынке, это могло появиться 5, 10, может быть, 15 лет назад. Так что, если нет рынка для вещи, никто ››› - person ShinTakezou; 23.06.2010
comment
››› пытается продать его, даже если он лучше того, что продается сейчас. --- хватит с этими длинными комментариями: демократически я прав, вы оптимистически ошибаетесь :D (просто потому, что это не очень удобное место, где можно долго высказывать свое мнение по этому поводу) - person ShinTakezou; 23.06.2010
comment
Черт, я бы сказал, что источником является 8080, а не 8086 — 8086 всегда казался мне 16-битным 80-м. - person Chris Charabaruk; 23.01.2011
comment
@Chris: я не верю, что современные x86 поддерживают совместимость с кодом 8080. - person Billy ONeal; 23.01.2011
comment
@Billy: Нет, но набор инструкций начался именно там. Вы будете поражены тем, насколько они похожи, даже если нет 8-битной совместимости. По крайней мере, 8080 является крестным отцом x86. (Кроме того, лишний апостроф.) - person Chris Charabaruk; 23.01.2011
comment
@Chris: А, я понимаю, что ты имеешь в виду. Я упомянул 8086 только потому, что современные чипы x86 все еще содержат оборудование для запуска кода 8086 (но не кода 8080). - person Billy ONeal; 23.01.2011
comment
@Chris: приведи мне пример того, насколько похожи наборы инструкций. Я запрограммировал 8080, Z80 и 8086 (PDP/8, PDP/11, VAX, 370 и 68000) на ассемблере, и единственное сходство, которое я могу придумать, связано со строковыми инструкциями в Z80, которые, я думаю, Intel посмотрели, прежде чем внедрять свои собственные на 8086. - person Olof Forshell; 01.02.2011
comment
@Chris: каждый набор инструкций где-то берет свое начало. Например, по слухам, строковые инструкции 8086 взяты из Z80. Я программировал 8080, 8085, Z80 и 8086 на уровне ассемблера и, конечно же, не удивлен тем, насколько похожи наборы инструкций 8080 и 8086 просто потому, что они не похожи. После прочтения этого cpu-world.com/Arch/8080.html я не не думаю, что кто-либо еще будет либо. Ваше здоровье! - person Olof Forshell; 02.02.2011
comment
8086 ISA был специально разработан для облегчения написания трансляторов с 8080 на 8086 ассемблер. Википедия говорит, что 8080 был совместим по исходному коду с 8008 (означает ли это реальную совместимость по исходному коду или ему нужен переводчик?), поэтому набор инструкций x86 можно проследить, по крайней мере, до 8008 в 1972 году. - person ninjalj; 16.07.2011
comment
Это одна из вещей, которая делает набор инструкций x86 таким уродливым, поскольку он не может решить, является ли он архитектурой, основанной на аккумуляторе или регистровом файле (хотя это было в основном исправлено в 386, что сделало набор инструкций гораздо более ортогональным). , независимо от того, что вам говорят поклонники 68k). - person ninjalj; 16.07.2011
comment
@ninjalj: пожалуйста, приведите несколько реальных примеров инструкций, показывающих, что ISA 8086 была специально разработана для облегчения написания трансляторов с сборки 8080 на 8086. - person Olof Forshell; 03.08.2011
comment
В настоящее время x86 все равно переводится в инструкции в стиле RISC до того, как он будет выполнен. Кем? сам процессор? - person The Mask; 25.04.2014
comment
В риск переводится загрузкой горячих транзисторов, которые не являются ни кешем, ни чем-либо еще полезным. - person ctrl-alt-delor; 01.07.2014
comment
@OlofForshell: 8080 имеет три пары 8-битных регистров (HL, BC и DE), которые в некоторых инструкциях будут использоваться как 16-битные регистры. Эти пары регистров довольно хорошо сопоставляются с BX, CX, DX. Последовательность инструкций lahf / push ax примерно эквивалентна push af 8080, а pop ax / sahf примерно эквивалентна pop af. На практике очень мало кода требует сохранения AL и F без одновременного сохранения AH, но у 8080 не было эквивалента AH. - person supercat; 30.07.2015
comment
@supercat: примерно эквивалентно мало что доказывает. BC и DE могут использоваться как адресные регистры для косвенной загрузки значений из памяти. Ни CX, ни DX не допускают этого, вместо этого вам нужно будет использовать SI и DI, которые не разделены на два 8-битных регистра, как CX (CH/CL) и DX (DH/DL). Я предполагаю, что классификация 8080-происхождений зависит от личных убеждений, того, что человек хочет видеть или не видеть, и от выбора примеров больше всего на свете. - person Olof Forshell; 31.07.2015
comment
@OlofForshell: поскольку код, написанный для 8080, не будет использовать ничего эквивалентного SI и DI, можно заменить то, что в нотации Z80 будет LD A, (DE) [это инструкция 8080, но я забыл нотацию 8080] на MOV SI,CX / MOV AL,[SI]. Я не уверен, что механический перевод, вероятно, даст хороший код, но книги данных, напечатанные Intel для 8088, способствовали простоте переноса кода 8080. Независимо от того, было ли такое утверждение действительно правдой, Intel продвигала его. - person supercat; 31.07.2015
comment
re: переименование регистров: даже реализации RISC ISA с большим количеством архитектурных регистров (например, 32) по-прежнему используют переименование регистров для поддержки больших неупорядоченных окон с большим количеством инструкций в процессе выполнения. Недостаток архитектурных регистров вредит дополнительным инструкциям по сохранению/перезагрузке из памяти, когда не хватает архитектурных регистров для хранения всех полезных значений в регистрах. много против нескольких архитектурных регистров отличается от маленького или большого файла физического регистра с переименованием регистра. Вы бы все равно использовали reg. переименование для любой ISA, в высокопроизводительной реализации. - person Peter Cordes; 09.12.2015
comment
@Peter: Да, это то, что я пытался сказать. А именно, что существует ощущение меньшего количества физических регистров, потому что ISA имеет меньшее количество регистров. Отредактировано, чтобы сказать это более четко. - person Billy ONeal; 09.12.2015
comment
@BillyONeal: я думаю, что скрыл свою точку зрения. Вы по-прежнему упускаете из виду, что отсутствие архитектурных регистров само по себе является проблемой. Большое количество физических регистров помогает одновременно поддерживать в рабочем состоянии множество insns, но большее количество архитектурных регистров сокращает количество инструкций, необходимых для выполнения одной и той же задачи. код x86, особенно 32-бит, часто приходится многократно загружать из памяти (или, что еще хуже, сохранять и позже перезагружать) или пересчитывать что-то, потому что не хватает архитектурных регистров, чтобы поддерживать это в итерациях цикла. Некоторым помогает микрослияние AMD/Intel uop, но оно по-прежнему требует цикла загрузки порта. - person Peter Cordes; 09.12.2015
comment
Моделирование показало, что выигрыш от перехода от 16 к 32 архитектурным регистрам будет меньше, чем от 8 до 16 для некоторых видов кода. IIRC, цифры были примерно на 15% ускорение для 8-> 16 и 5% ускорение для 16-> 32. Я не помню контекст, или если они точны, но это было в какой-то статье о типичном коде в целом, а не о каком-то конкретном алгоритме. Дело в том, что переименование реестра не все исправляет. Есть причина, по которой AVX512 увеличивает количество векторных регистров до 32. - person Peter Cordes; 09.12.2015
comment
@Peter: Магазин и последующая перезагрузка не удаляются? - person Billy ONeal; 09.12.2015
comment
@BillyONeal: Store-forwarding снижает задержку примерно до 5 циклов (семейство Intel SnB). Это то, что вы имели в виду под псевдонимом? Автономная загрузка mov по-прежнему является отдельной инструкцией, которую нужно декодировать, которая занимает место в кеше uop и занимает слот задачи в ядре с 4 операциями за цикл вне очереди. Он даже занимает порт загрузки (или порт хранилища) на цикл, конкурируя за пропускную способность кэша L1 с другими операциями памяти. Руководство Agner Fog по микроархитектуре документирует внутреннее устройство всех последних процессоров. - person Peter Cordes; 09.12.2015
comment
Я просто пошел вперед и вставил то, что хотел бы сказать, вместо того, чтобы играть взад и вперед в комментариях. Мне нравится, что SO работает таким образом. :) - person Peter Cordes; 09.12.2015
comment
Этот ответ в порядке, но я бы не сказал, что это хороший ответ. Все изложенные пункты поверхностны и расплывчаты. Есть две части вопроса, почему x86 уродлив и почему x86 хуже. Этот ответ выглядит как неорганизованный набор утверждений с неясными отношениями друг к другу или к вопросам. Я думаю, что хороший ответ должен указать (и объяснить, почему), какие именно функции x86 делают его уродливым, какие функции делают его хуже, какие функции делают его лучше, и почему все эти функции были добавлены в x86. Другие ответы не лучше. - person Hadi Brais; 19.04.2018
comment
@BillyONeal для последнего пункта, насколько мне известно, это позволяет большему количеству кода из оперативной памяти помещаться в тот же размер кеша, поскольку многие используемые инструкции по-прежнему имеют длину в один байт, что компенсирует требуемую сложность процессора с точки зрения производительности. - person user2284570; 17.12.2020
comment
@BillyONeal Я бы также добавил en.wikipedia.org/wiki/Orthogonal_instruction_set. Хотя я сомневаюсь, что скомпилированный код помещает константы в регистры даже для одной операции, что может означать, что большинство инструкций не поддерживает использование константы в качестве операнда (в отличие от того, что было сохранено в RISC). - person user2284570; 17.12.2020
comment
@TheMask за то, что увидел взломанный микрокод Intel rsa, расшифрованный, я могу сказать, что на 64-битных микрооперациях все 48-битные. И их можно кэшировать. Некоторые производители даже разрешают доступ к реальному набору инструкций напрямую ru.wikipedia.org/wiki/Эльбрус_2000 en.wikipedia.org/wiki/Alternate_Instruction_Set. - person user2284570; 18.12.2020

На мой взгляд, основным недостатком x86 является его происхождение из CISC — набор инструкций содержит множество неявных взаимозависимостей. Эти взаимозависимости затрудняют выполнение таких операций, как переупорядочивание инструкций на микросхеме, потому что артефакты и семантика этих взаимозависимостей должны сохраняться для каждой инструкции.

Например, большинство инструкций сложения и вычитания целых чисел x86 изменяют регистр флагов. После выполнения сложения или вычитания следующей операцией часто является просмотр регистра флагов для проверки переполнения, знакового бита и т. д. Если после этого есть еще одно сложение, очень сложно сказать, безопасно ли начинать выполнение второго сложения. до того, как станет известен результат 1-го добавления.

В архитектуре RISC инструкция добавления будет указывать входные операнды и выходные регистры, и все, что касается операции, будет выполняться с использованием только этих регистров. Это значительно упрощает разделение операций добавления, которые находятся рядом друг с другом, потому что нет регистра флагов распускания, заставляющего все выстраиваться в линию и выполнять один файл.

Чип DEC Alpha AXP, дизайн RISC в стиле MIPS, был болезненно спартанским в доступных инструкциях, но набор инструкций был разработан, чтобы избежать неявных зависимостей регистров между инструкциями. Аппаратно-определяемого стекового регистра не было. Не было регистра аппаратно-определяемых флагов. Даже указатель инструкций был определен ОС — если вы хотели вернуться к вызывающей стороне, вам нужно было решить, как вызывающая сторона сообщит вам, по какому адресу следует вернуться. Обычно это определялось соглашением о вызовах ОС. Однако на x86 это определяется аппаратным обеспечением чипа.

Как бы то ни было, за 3 или 4 поколения чипов Alpha AXP аппаратное обеспечение превратилось из буквальной реализации спартанского набора инструкций с 32 регистрами int и 32 регистрами с плавающей запятой в чрезвычайно неупорядоченный исполнительный механизм с 80 внутренними регистрами, переименованием регистров, переадресация результата (где результат предыдущей инструкции перенаправляется в более позднюю инструкцию, которая зависит от значения) и всевозможные дикие и сумасшедшие ускорители производительности. И со всеми этими прибамбасами кристалл AXP все еще был значительно меньше, чем сопоставимый кристалл Pentium того времени, и AXP был чертовски быстрее.

Вы не видите таких всплесков повышения производительности в генеалогическом дереве x86 в основном потому, что сложность набора инструкций x86 делает многие виды оптимизации выполнения непомерно дорогими, если не невозможными. Гениальный ход Intel состоял в том, что он отказался от реализации набора инструкций x86 в аппаратном обеспечении - все современные чипы x86 на самом деле являются RISC-ядрами, которые в определенной степени интерпретируют инструкции x86, переводя их во внутренний микрокод, который сохраняет всю семантику исходного x86. инструкции, но позволяет немного этого RISC не по порядку и других оптимизаций по сравнению с микрокодом.

Я много писал на ассемблере x86 и могу полностью оценить удобство его корней CISC. Но я не осознавал в полной мере, насколько сложным был x86, пока не потратил некоторое время на написание ассемблера Alpha AXP. Я был ошеломлен простотой и единообразием AXP. Различия огромны и глубоки.

person dthorpe    schedule 21.04.2010
comment
Я не буду слушать нападки на CISC как таковой до тех пор, пока вы не сможете объяснить m68k. - person dmckee --- ex-moderator kitten; 21.04.2010
comment
@dmckee: я ОП. Я ничего не знаю о m68k Но можете ли вы объяснить, почему это не относится к m68k? - person claws; 21.04.2010
comment
Я не знаком с m68k, поэтому не могу его критиковать. - person dthorpe; 22.04.2010
comment
Я не думаю, что этот ответ настолько плох, чтобы понизить его, но я действительно думаю, что весь RISC меньше и быстрее, чем аргумент CISC, не очень актуален в современную эпоху. Конечно, AXP мог быть чертовски быстрее для своего времени, но дело в том, что современные RISC и современные CISC примерно одинаковы, когда дело доходит до производительности. Как я сказал в своем ответе, небольшое снижение мощности при декодировании x86 является причиной не использовать x86 для чего-то вроде мобильного телефона, но это небольшой аргумент в пользу полноразмерного настольного компьютера или ноутбука. - person Billy ONeal; 23.04.2010
comment
@Billy: размер больше, чем просто размер кода или размер инструкции. Intel платит довольно много за площадь поверхности чипа, чтобы реализовать аппаратную логику для всех этих специальных инструкций, независимо от того, находится ли ядро ​​микрокода RISC под капотом или нет. Размер кристалла напрямую влияет на стоимость производства, поэтому он по-прежнему актуален при проектировании современных систем. - person dthorpe; 23.04.2010
comment
@dthorpe: Правда? Я хотел бы, чтобы это утверждение было подкреплено некоторыми фактическими данными о площади кристалла, затраченной на декодирование x86. В противном случае у меня нет другого выбора, кроме как сбрасывать со счетов это как FUD. Глядя на последние чипы Intel, более половины чипа — это кеш. Почему-то я не думаю, что декодирование x86 занимает значительную часть площади кристалла. - person Billy ONeal; 23.04.2010
comment
Я хотел бы добавить, что RISC-подобная ортогональность в конструкции, подобной CISC, возможна: Texas Instruments сделала это несколько десятилетий назад со своей архитектурой 990. Микропроцессор 9900 имел удивительно чистый дизайн. Я написал сборку для чипов Z80, 8086/88, 6502 и 9900, и 9900, безусловно, лучший дизайн, IMO. Тем не менее, x86 был местом, где мне платили. - person staticsan; 21.06.2010
comment
Была статья Джона Стоукса из arstechnica, в которой говорилось, что количество транзисторов, используемых для трансляции x86-RISC, осталось в основном постоянным, а это означает, что его относительный размер по сравнению с общим количеством транзисторов в кристалле сократился: arstechnica.com/old/content/2004/07/pentium-1.ars/2 - person ninjalj; 16.07.2011
comment
@dthorpe: я не согласен с большей частью, если не со всем, что вы написали. Начиная с 8086, вам не нужно было беспокоиться о том, безопасно ли выполнять add после другого add. Правила ясны. Вам также не нужно иметь дело с изменением порядка инструкций. Со времен Pentium Pro в середине 90-х ЦП делает это за вас. То, о чем вы говорите, возможно, было проблемой 20 лет назад, но я не вижу причин противопоставлять ее архитектуре x86 в наши дни. - person Nathan Fellman; 04.05.2013
comment
Переименование EFLAGS позволяет избежать зависимостей записи после записи. Даже упорядоченный Pentium P5 может работать add с пропускной способностью 2 операций за такт, и он не выполняет внутреннее декодирование в моп. Современные x86, такие как Haswell/Skylake, имеют пропускную способность 4 за такт для add и других простых операций ALU, которые записывают, но не читают флаги. Есть много бородавок и замедлений, но они более тонкие; например обновление частичного флага inc сложнее обрабатывать аппаратно (и P4 пытался избежать его обработки). Кроме того, оставлять немодифицированными флаги для счетчика сдвига, равного нулю, очень неудобно. - person Peter Cordes; 01.11.2017
comment
@NathanFellman Программистам не нужно об этом беспокоиться, но чипу нужно! - person user253751; 16.02.2018
comment
@dmckee --- ex-moderatorkitten Я бы сказал, учитывая количество регистров, которые обе инструкции установили в соответствии с дизайном в то время, когда оперативная память была быстрее, чем процессор, следовательно, меньшее количество регистров и, возможно, более высокая частота промахов кеша. - person user2284570; 17.12.2020

Архитектура x86 восходит к конструкции микропроцессора 8008 и его родственников. Эти ЦП были разработаны в то время, когда память была медленной, и если вы могли сделать это на кристалле ЦП, часто это было намного быстрее. Однако место на кристалле ЦП также было дорогим. Эти две причины объясняют, почему существует лишь небольшое количество регистров, которые, как правило, имеют специальное назначение, и сложный набор инструкций со всевозможными подводными камнями и ограничениями.

Другие процессоры той же эпохи (например, семейство 6502) также имеют аналогичные ограничения и особенности. Интересно, что и серия 8008, и серия 6502 были задуманы как встроенные контроллеры. Даже в то время ожидалось, что встроенные контроллеры будут программироваться на ассемблере, и во многих отношениях они были ориентированы на программиста на ассемблере, а не на автора компилятора. (Посмотрите на микросхему VAX, чтобы узнать, что происходит, когда вы обслуживаете запись компилятора.) Разработчики не ожидали, что они станут вычислительными платформами общего назначения; для этого и были созданы предшественники архитектуры POWER. Революция домашних компьютеров, конечно же, изменила это.

person staticsan    schedule 21.04.2010
comment
+1 за единственный ответ здесь от кого-то, у кого действительно есть исторический опыт в этом вопросе. - person Billy ONeal; 23.04.2010
comment
есть и другие cisc-процессоры, вышедшие из 8-битной эры (m68k можно считать потомком 6800; z8000 или аналогичный от z80...), которые превратились в более совершенные cisc-процессоры, так что это не очень хорошее оправдание. Вымирание — единственный путь к настоящей эволюции, и попытка обеспечить обратную совместимость — это недостаток и ограничение, а не особенность. Статус домашнего компьютера запоздал, если вы думаете об обещаниях революции домашних компьютеров. И я считаю, что часть вины заключается в проблеме обратной совместимости, которая касается маркетинга, а не технологии. - person ShinTakezou; 20.06.2010
comment
Да, я не упомянул маркетинг. Это была чрезвычайно мощная сила на жизненном пути архитектуры x86, и я не знаю, почему я ее упустил. - person staticsan; 21.06.2010
comment
Память всегда была медленной. Возможно (относительно) сегодня она медленнее, чем была, когда я начинал с Z80 и CP/M в 1982 году. Вымирание — не единственный путь эволюции, потому что с вымиранием это конкретное направление эволюции прекращается. Я бы сказал, что x86 хорошо адаптировался за 28 лет своего существования (на данный момент). - person Olof Forshell; 08.12.2010
comment
Оглянитесь вокруг, и вы увидите, что CISC доминируют, несмотря на их предположительно худший набор инструкций и архитектуру. RISC удалось захватить кусок рынка или создать новый. Чтобы описать это произведение, я скажу, что оно значимо, но не очень значимо. CISC — это компетентные технологические продукты, любите вы их, ненавидите или что-то в этом роде. Как и RISC. Вероятно, через пять лет она не сильно изменится. Может через десять. Кто знает? - person Olof Forshell; 08.12.2010
comment
Скорость памяти ненадолго достигла почти паритета с процессорами примерно во времена 8086. Конструкция 9900 от Texas Instruments работает только потому, что это произошло. Но затем процессор снова вырвался вперед и остался там. Только теперь есть кеши, которые помогут справиться с этим. - person staticsan; 09.12.2010
comment
8080 был расширением 8008. 8086 был смоделирован на основе 8080 и действительно был совместим с ассемблером. Это дало ранним ПК IBM сразу много программного обеспечения, поскольку большую часть программного обеспечения 8080 можно было просто собрать заново (за счет снижения производительности). Было много расширений адресации памяти и возможностей процессора: 8008 адресовал 16 КБ, 8080 адресовал 64 КБ, 8086 адресовал 1 МБ (MS-DOS зарезервировала большую часть этого, оставив 640 КБ) и, в конечном итоге, 4 МБ. Сохранение бинарной совместимости с семействами чипов, начиная с одного источника, совместимого с 8008, ну... - person David Thornley; 05.01.2011
comment
@David: вы говорите, что 8086 был совместим с 8080 на ассемблере. У вас есть пример, чтобы поделиться с нами? Это немалый подвиг, учитывая богатый набор инструкций 8086 по сравнению со скудным набором 8080. - person Olof Forshell; 01.02.2011
comment
@Olof Forshell: он был совместим с ассемблером в том смысле, что ассемблерный код 8080 мог переводиться в код 8086. С этой точки зрения это был 8080 плюс расширения, так же, как вы могли рассматривать 8080 как 8008 плюс расширения. - person David Thornley; 01.02.2011
comment
@David: я думаю, вы перепутали слово «совместимый» со словами «переводимый» или «эмулируемый». То, о чем вы говорите, не имеет ничего общего с совместимостью. Если бы это было так, вы могли бы также сказать, что 8080 совместим с архитектурой 360, если вы переведете это. - person Olof Forshell; 01.02.2011
comment
@Olof Forshell: За исключением того, что 8086 был разработан для этого. Это было расширение 8080, и большинство (возможно, все) инструкций 8080 отображались один к одному с явно схожей семантикой. Это не относится к архитектуре IBM 360, как бы вы ее ни продвигали. - person David Thornley; 01.02.2011
comment
@David: согласно Википедии: позиционируемый как совместимый с исходным кодом, 8086 был разработан таким образом, чтобы язык ассемблера для 8008, 8080 или 8085 мог быть автоматически преобразован в эквивалентный (субоптимальный) исходный код 8086 с небольшим ручным редактированием или без него. . Первое слово продается, что означает более или менее верное. Остальное означает, что какой-то транслятор исходного кода на ассемблере будет выполнять преобразование инструкции за инструкцией из исходного кода на ассемблере 8080 в то же самое 8086, что затем требует сборки и компоновки. Я думаю, что вы читаете об этом гораздо больше, чем разумно для разговоров о продажах. - person Olof Forshell; 01.02.2011
comment
@Olof Forshell: К сожалению, все мои источники давно утилизированы, но я немного следил за тем, что происходило в то время, и не получаю информацию из Википедии. У меня было достаточное знакомство с 8080 и меньшее знакомство с 8086, так что для меня это выглядело почти правдой. Я читал, что оригинальный бейсик был медленным, потому что он был конвертирован из 8080. - person David Thornley; 01.02.2011
comment
@Olof Forshell: То, что Википедия говорит «Продается как ...», не означает, что это было ни в коей мере неправильно. Маркетинговый материал будет легче найти и процитировать, чем что-либо техническое. Более того, пока мы проводим толкование Википедии, в нем говорится, что 8086 был разработан, подразумевая, что процессор был разработан для облегчения совместимости на уровне ASM (хотя и не для двоичной совместимости). - person David Thornley; 01.02.2011
comment
@David: на 8080 были 7-байтовые регистры a (аккумулятор), b, c, d, e, h и l. Потом был реестр флагов. Флаги и a составляют psw (слово состояния программы). b&c, d&e и h&l могут использоваться как 16-битные записи, такие как ldax b, и затем адресуются с помощью первого регистра в паре или lhld mem, это не было полностью продумано. b/c, d/e и h/l могут использоваться для косвенной адресации, такой как ldax d или mov a,m (m — память пары h/l). Сразу же я вижу несколько проблем с вашей аргументацией. Psw не существует на 8086, поэтому он имеет lahf/sahf ... - person Olof Forshell; 02.02.2011
comment
... компенсировать. 8080 имеет три разделенных регистра для адресации памяти, а 8086 — один, bx (bl/bh). Вместо этого нужно было бы использовать sd и di с большим количеством xchg-ов между bx и ими. Совместимый? НЕТ! Даже на исходном уровне - person Olof Forshell; 02.02.2011
comment
Я забыл компьютер и указатель стека. Вот описание архитектуры cpu-world.com/Arch/8080.html . Маркетинг и реклама допускают сообщения, содержание которых варьируется от правды до лжи, хотя большинство из них попадает в верхнюю часть правды на половине игрового поля. На мой взгляд, вопрос совместимости с ассемблером находится на грани между правдой и ложью: не совсем правда, но и не полная ложь. Стакан наполовину полон или наполовину пуст? Для меня он полупустой и я объяснил почему, Википедия или не Википедия. - person Olof Forshell; 02.02.2011
comment
Много лет назад я немного поиграл с платой для разработки 8080, и я думал об этой совместимости с сборкой с тех пор, как эта тема была возрождена. Я припоминаю, что был доступен переводчик для минимального перевода с сборки 8080 на сборку 8086. Это не было бы сложной задачей, учитывая аналогичную структуру реестра. - person staticsan; 03.02.2011
comment
Я хочу сказать, что совместимость и совместимость после преобразования — это два совершенно разных понятия. Приравнивание их — это переопределение слова «совместимый», означающее практически что угодно. В первые дни IBM-совместимый ПК требовал, чтобы ПК-кандидат мог работать точно так же на всех уровнях программного обеспечения, ОС, BIOS и оборудования. Большинство использовало 8088 @ 4,77 МГц, но Compaq показала, что ПК с 8086 или 80286 (защищенный режим BIOS) на более высокой частоте также может быть совместим. С тех пор вопрос о совместимости был передан в ведение различных комитетов, но слово «совместимость» имеет точное значение... - person Olof Forshell; 03.02.2011
comment
... и не должны обесцениваться. - person Olof Forshell; 03.02.2011
comment
@staticsan неправильно! задержка процессора стала быстрее, чем у оперативной памяти, начиная с 1980 года, поэтому en.wikipedia.org/wiki/Orthogonal_instruction_set. Это было сделано потому, что бараны были очень маленькими и дорогими. - person user2284570; 17.12.2020
comment
@BillyONeal, за исключением того, что это неправильно. - person user2284570; 17.12.2020

У меня есть несколько дополнительных аспектов:

Рассмотрим операцию «a=b/c», которую x86 реализует как

  mov eax,b
  xor edx,edx
  div dword ptr c
  mov a,eax

В качестве дополнительного бонуса инструкция div edx будет содержать остаток.

Процессору RISC потребуется сначала загрузить адреса b и c, загрузить b и c из памяти в регистры, выполнить деление и загрузить адрес a, а затем сохранить результат. Синтаксис DST,SRC:

  mov r5,addr b
  mov r5,[r5]
  mov r6,addr c
  mov r6,[r6]
  div r7,r5,r6
  mov r5,addr a
  mov [r5],r7

Здесь обычно не будет остатка.

Если какие-либо переменные должны быть загружены через указатели, обе последовательности могут стать длиннее, хотя это менее вероятно для RISC, поскольку он может иметь один или несколько указателей, уже загруженных в другой регистр. x86 имеет меньше регистров, поэтому вероятность того, что указатель находится в одном из них, меньше.

Плюсы и минусы:

Инструкции RISC могут быть смешаны с окружающим кодом для улучшения планирования инструкций, это меньше возможностей для x86, который вместо этого работает (более или менее хорошо, в зависимости от последовательности) внутри самого ЦП. Приведенная выше последовательность RISC обычно имеет длину 28 байт (7 инструкций шириной 32 бита/4 байта каждая) в 32-битной архитектуре. Это заставит внешнюю память работать больше при выборке инструкций (семь выборок). Более плотная последовательность x86 содержит меньше инструкций, и хотя их ширина различается, вы, вероятно, тоже смотрите на среднее значение 4 байта на инструкцию. Даже если у вас есть кэши инструкций для ускорения этого, семь выборок означают, что у вас будет дефицит в три в другом месте, чтобы компенсировать по сравнению с x86.

Архитектура x86 с меньшим количеством регистров для сохранения/восстановления означает, что она, вероятно, будет переключать потоки и обрабатывать прерывания быстрее, чем RISC. Большее количество регистров для сохранения и восстановления требует больше временного пространства стека ОЗУ для выполнения прерываний и больше постоянного пространства стека для хранения состояний потоков. Эти аспекты должны сделать x86 лучшим кандидатом для запуска чистой RTOS.

Если говорить более лично, мне кажется, что писать RISC-ассемблер сложнее, чем x86. Я решаю эту проблему, написав процедуру RISC на C, скомпилировав и модифицировав сгенерированный код. Это более эффективно с точки зрения создания кода и, вероятно, менее эффективно с точки зрения выполнения. Все эти 32 регистра, которые нужно отслеживать. С x86 все наоборот: 6-8 регистров с "настоящими" именами делают проблему более управляемой и вселяют больше уверенности в том, что полученный код будет работать так, как ожидается.

Уродливый? Это в глазах смотрящего. Я предпочитаю "другое".

person Olof Forshell    schedule 07.12.2010
comment
a, b и c в моих примерах следует рассматривать как переменные в памяти, а не как непосредственные значения. - person Olof Forshell; 20.12.2010
comment
... dword ptr используется для указания размера переменной, размер которой неизвестен, если, например, она просто объявлена ​​как внешняя или если вы поленились. - person Olof Forshell; 20.12.2010
comment
Уже не в первый раз слышу предложение сначала написать на C, а потом перегнать на ассемблер. Это определенно помогает - person Joe Plante; 27.09.2014
comment
Раньше все процессоры были RISC. CISC появился как стратегия смягчения последствий для систем памяти с железным сердечником, которые были ОЧЕНЬ медленными, поэтому CISC с меньшим количеством более мощных инструкций меньше нагружал подсистему памяти и лучше использовал пропускную способность. Точно так же регистры изначально рассматривались как ячейки памяти внутри процессора для выполнения накоплений. В последний раз я серьезно тестировал RISC-машину в 1993 году — SPARC и HP Prisim. SPARC был ужасен по всем направлениям. Prisim был в 20 раз быстрее, чем 486, на add/sub/mul, но отстой на трансцендентных. ЦИС лучше. - person ; 22.10.2014
comment
@OlofForshell Вы говорите there typically won't be a reminder, но вики говорит, что это есть у mips: en.wikipedia.org/wiki/MIPS_instruction_set #целое - person Alex Zhukovskiy; 04.02.2016
comment
@Alex Zhukovsky: я не знал, что MIPS — это типичный RISC-процессор. Типичным для меня является ARM или PowerPC. - person Olof Forshell; 04.02.2016
comment
@OlofForshell Зависит. В отличие от x86, risc обычно закодирует константы непосредственно внутри инструкций, вместо того, чтобы использовать их из оперативной памяти или регистра. - person user2284570; 17.12.2020
comment
@ user2284570 Я не понимаю, что вы имеете в виду. x86-32 mov Instant позволяет включать константу как часть инструкции для загрузки 8-, 16- или 32-битного регистра. В PowerPC вы загружаете непосредственные константы в 32-разрядный регистр 16-разрядными частями, по одной за раз, несколько упрощенно. Для обеих архитектур существуют регистровые инструкции для регистрации, но, конечно, исходный регистр должен содержать что-то значимое для начала, возможно, в результате предварительной загрузки памяти или немедленной постоянной загрузки. Или я что-то упускаю? - person Olof Forshell; 18.12.2020
comment
@OlofForshell в том смысле, что инструкция mov является инструкцией x86, используемой для загрузки/сохранения, вы обычно перемещаете константу в регистр вместо выполнения сложения с константой, закодированной внутри инструкции. И на основе en.wikipedia.org/wiki/Orthogonal_instruction_set#RISC и моих знаний mips, могу сказать, что константы можно использовать с любыми инструкциями напрямую. - person user2284570; 18.12.2020
comment
@OlofForshell, и кажется, что Powerpc также может напрямую работать с небольшими константами. - person user2284570; 18.12.2020
comment
@ user2284570 вы написали В отличие от x86, risc обычно будет закодировать константы непосредственно внутри инструкций, вместо того, чтобы использовать их из оперативной памяти или регистра, что, насколько мне известно, не является истинным представлением того, как компилятор x86 выбирает загрузку констант в регистры. Существует множество способов использования непосредственного значения в арифметических, логических операциях и инструкциях перемещения. Конкретные выбранные инструкции очень сильно зависят от семейства процессоров/.../revision, выбранной оптимизации и знания компилятором характеристик останова процессора (и это лишь некоторые факторы)... - person Olof Forshell; 18.12.2020
comment
@user2284570 user2284570 ... в отношении положения инструкции в потоке выполнения, который собирается вместе. Существуют и другие способы загрузки немедленных значений, но использование комментариев для обсуждения всех возможных методов предоставления немедленного значения не кажется значимым из-за ограничений по размеру и потому, что единственные люди, которые знают, какие из них следует использовать, когда и когда, являются мастерами алхимии. написания оптимизаторов. Я не такой человек. - person Olof Forshell; 18.12.2020

Я думаю, что этот вопрос имеет ложное предположение. В основном только ученые, одержимые RISC, называют x86 уродливым. В действительности x86 ISA может выполнять операции с одной инструкцией, которые потребовали бы 5-6 инструкций на ISA RISC. Поклонники RISC могут возразить, что современные процессоры x86 разбивают эти «сложные» инструкции на микрооперации; Однако:

  1. Во многих случаях это правда лишь частично или совсем не соответствует действительности. Наиболее полезными «сложными» инструкциями в x86 являются такие вещи, как mov %eax, 0x1c(%esp,%edi,4), то есть режимы адресации, и они не разбиты на части.
  2. На современных машинах часто важнее не количество затраченных циклов (поскольку большинство задач не связаны с процессором), а влияние кода на кэш инструкций. 5-6 инструкций фиксированного размера (обычно 32-битных) повлияют на кеш намного больше, чем одна сложная инструкция, которая редко превышает 5 байт.

x86 действительно впитал в себя все хорошие стороны RISC лет 10-15 назад, а остальные качества RISC (собственно определяющее - минимальный набор инструкций) вредны и нежелательны.

Помимо стоимости и сложности производства ЦП и их энергопотребления, x86 является лучшей ISA. Любой, кто говорит вам обратное, позволяет идеологии или повестке дня мешать их рассуждениям.

С другой стороны, если вы ориентируетесь на встроенные устройства, для которых важна стоимость ЦП, или встроенные/мобильные устройства, для которых энергопотребление является главной проблемой, ARM или MIPS, вероятно, имеют больше смысла. Имейте в виду, что вам все равно придется иметь дело с дополнительной оперативной памятью и размером двоичного файла, необходимым для обработки кода, который легко в 3-4 раза больше, и вы не сможете приблизиться к производительности. Имеет ли это значение, во многом зависит от того, что вы будете на нем запускать.

person R.. GitHub STOP HELPING ICE    schedule 16.07.2011
comment
там, где энергопотребление является главной проблемой, ARM или MIPS, вероятно, имеют больше смысла... поэтому, если есть хотя бы один аспект, в котором ARM или MIPS имеют больше смысла, разве это не делает x86 не обязательно лучшая ISA? - person Shahbaz; 24.09.2013
comment
Вот почему я отобрал лучших, не считая стоимости... и их энергетических потребностей. - person R.. GitHub STOP HELPING ICE; 24.09.2013
comment
Я думаю, что Intel снизила скорость процессора, а меньшие размеры кристаллов в значительной степени устранили разницу в мощности. Новый двойной 64-разрядный процессор Celeron с 64 КБ кэш-памяти L1 и 1 МБ кэш-памяти L2 представляет собой чип мощностью 7,5 Вт. Это мой компьютер для тусовок в Starbucks, и время автономной работы смехотворно велико, и его хватит на столько же, сколько в автомате P6. Как парень, занимающийся в основном вычислениями с плавающей запятой, я давно отказался от RISC. Просто ползает. В частности, SPARC был ужасно ледяным. Прекрасным примером того, почему RISC отстой, был процессор Intel i860. Интел больше никогда ТАМ не появлялся. - person ; 22.10.2014
comment
@RocketRoy: 7,5 Вт на самом деле неприемлемо для устройства, которое работает круглосуточно и без выходных (и не выполняет полезные вычисления все время) или работает от батареи 3,7 В / 2000 мАч. - person R.. GitHub STOP HELPING ICE; 22.10.2014
comment
Вы определяете размер ЦП в соответствии с поставленной задачей и доступными ресурсами. Это не исключает архитектуры CISC или x86, это просто означает, что для некоторых приложений это может быть излишним. - person ; 23.10.2014
comment
Я только что просмотрел список процессоров MIPS, и все, что было за последние 10 лет, составляет 15-30 Вт, поэтому Celeron на 7,5 выглядит довольно стройным, особенно с учетом того, что он может дросселировать, спать и переходить в спящий режим. Удивительно для меня. - person ; 23.10.2014
comment
@RocketRoy Процессор Intel i860. Intel больше никогда туда не возвращалась. После небольшого исследования i860 звучит много как Itanium: VLIW, параллелизм команд, упорядоченный компилятором.... - person Jonathon Reinhart; 23.01.2017
comment
Просто некоторый взгляд на требования к мощности процессора. Мой Garmin 305 на моем велосипеде имеет максимальное потребление устройства 75 мВт, так что еще раз, снизьте требования, а затем выберите процессор. С практической точки зрения проще разработать или, по крайней мере, создать прототип, пока система не будет хорошо определена и понятна, на БОЛЬШОЙ коробке Intel, а затем портировать, чем бороться с минимальным оборудованием в течение всего цикла разработки. Особенно верно, если целевой средой является какая-то версия Linux. Похоже, что новой заменой 4 компьютерам истребителя F-16 является один блок Intel i7, позволяющий сэкономить сотни фунтов и ватт. - person ; 24.01.2017
comment
@R..GitHubSTOPHELPINGICE нет. Я бы все же сказал, что x86 отдает предпочтение кэшам, а не регистраторам, предоставляя меньшее количество регистров общего назначения. И рискуйте скоростью фокусировки на том, что важнее всего. Вот почему, например, даже на современном x86 не очень хорошая идея использовать инструкцию DIV с точки зрения задержки для деления 2 чисел (я имею в виду, что во много раз быстрее использовать намного больше инструкций x86). - person user2284570; 17.12.2020

Язык ассемблера x86 не так уж плох. Когда вы добираетесь до машинного кода, он начинает становиться действительно уродливым. Кодировки инструкций, режимы адресации и т. д. намного сложнее, чем для большинства процессоров RISC. Кроме того, в целях обратной совместимости встроены дополнительные функции, которые срабатывают только тогда, когда процессор находится в определенном состоянии.

Например, в 16-битных режимах адресация может показаться совершенно странной; есть режим адресации для [BX+SI], но нет для [AX+BX]. Такие вещи, как правило, усложняют использование регистров, поскольку вам необходимо убедиться, что ваше значение находится в регистре, который вы можете использовать по мере необходимости.

(К счастью, 32-битный режим намного разумнее (хотя иногда он сам по себе немного странный — например, сегментация), а 16-битный код x86 больше не имеет значения за пределами загрузчиков и некоторых встроенных сред.)

Есть также пережитки прошлых дней, когда Intel пыталась сделать x86 совершенным процессором. Инструкции длиной в пару байтов, которые выполняли задачи, которые на самом деле больше никто не делает, потому что они, откровенно говоря, были чертовски медленными или сложными. Инструкции ENTER и LOOP, для двух примеров - обратите внимание, что код фрейма стека C похож на "push ebp; mov ebp, esp", а не на "enter" для большинства компиляторов.

person cHao    schedule 21.04.2010
comment
Я считаю, что проблема ввода по сравнению с push/mov возникла из-за того, что на некоторых процессорах push/mov работает быстрее. На некоторых процессорах ввод выполняется быстрее. Такова жизнь. - person Dietrich Epp; 21.04.2010
comment
Когда я был вынужден использовать машину на базе x86 и начал на нее смотреть (имея опыт работы с m68k), я начал чувствовать разочарование в программировании на ассемблере, ... например, если бы я изучил программирование на таком языке, как C, а затем вынуждены войти в контакт с asm... вы чувствуете, что теряете силу выражения, легкость, ясность, согласованность, интуитивность. Я уверен, что если бы я начал программировать asm с x86, я бы подумал, что это не так уж плохо. ..может быть... Я также делал MMIX и MIPS, и их ассемблерный язык намного лучше, чем x86 (если это правильный PoV для Q, но, возможно, это не так) - person ShinTakezou; 20.06.2010
comment
Проблема режима адресации была исправлена ​​в 80386. Только 16-битный код имеет ограниченные режимы адресации, 32-битный код намного лучше. Вы можете получить 32-битные режимы адресации в 16-битном коде, используя специальный префикс, и наоборот. - person fuz; 09.05.2015
comment
@FUZxxl: Да ... мне, наверное, следовало упомянуть, что уродство в основном ограничено 16-битным кодом. Исправлено (думаю). :) - person cHao; 09.05.2015
comment
Воспринимаемая неэлегантность в основном происходит из-за неправильного представления о том, что регистры 8086 являются регистрами общего назначения; это неправильно. У каждого из них есть особая цель, и если вы не будете придерживаться их целей, у вас будут плохие времена. - person fuz; 10.05.2015
comment
@FUZxxl: Ага. Но, как правило, вам все равно будет плохо. :) Это была одна из худших вещей в 8086 — на самом деле вообще не было чисто регистров общего назначения — и это, вероятно, чертовски шокирует кого-то, кто приступит к нему свежим взглядом с точки зрения RISC. Даже модель 386 не исправила это полностью, но, по крайней мере, сделала его намного менее ограничивающим. - person cHao; 10.05.2015

Я не эксперт, но кажется, что многие функции, которые не нравятся людям, могут быть причиной того, что он работает хорошо. Несколько лет назад наличие регистров (вместо стека), фреймов регистров и т. д. рассматривалось как хорошее решение, позволяющее упростить архитектуру для людей. Однако в настоящее время важна производительность кеша, а слова переменной длины x86 позволяют хранить в кеше больше инструкций. «Декодирование инструкций», на которое, как я полагаю, указывали противники, когда-то занимало половину чипа, уже далеко не так.

Я думаю, что параллелизм — один из самых важных факторов в наши дни — по крайней мере, для алгоритмов, которые уже работают достаточно быстро, чтобы их можно было использовать. Выражение высокого параллелизма в программном обеспечении позволяет аппаратному обеспечению амортизировать (или часто полностью скрывать) задержки памяти. Конечно, далеко идущее архитектурное будущее, вероятно, связано с чем-то вроде квантовых вычислений.

Я слышал от nVidia, что одной из ошибок Intel было то, что они держали двоичные форматы близко к оборудованию. CUDA PTX выполняет несколько быстрых вычислений использования регистров (раскрашивание графика), поэтому nVidia может использовать регистровую машину вместо стековой, но при этом иметь путь обновления, который не ломает все старое программное обеспечение.

person gatoatigrado    schedule 21.04.2010
comment
RISC не был разработан для разработчиков-людей. Одна из идей RISC заключалась в том, чтобы переложить часть сложности чипа на того, кто пишет сборку, в идеале на компилятора. Больше регистров означало меньшее использование памяти и меньше зависимостей между инструкциями, что позволяло использовать более глубокие конвейеры и повышать производительность. Обратите внимание, что x86-64 имеет в два раза больше регистров общего назначения, чем x86, и уже одно это обеспечивает значительный прирост производительности. И инструкции на большинстве чипов x86 декодируются до кэширования, а не после (поэтому размер здесь не имеет значения). - person Dietrich Epp; 21.04.2010
comment
@Дитрих Эпп: Это не совсем так. У x86-64 действительно больше регистров, видимых в ISA, но современные реализации x86 обычно имеют файл регистров в стиле RISC, который по запросу сопоставляется с регистрами ISA для ускорения выполнения. - person Billy ONeal; 21.04.2010
comment
Я слышал от nVidia, что одной из ошибок Intel было то, что они держали двоичные форматы близко к оборудованию. -- Я не понял этого и PTX-части CUDA. - person claws; 21.04.2010
comment
@Dietrech Epp: И инструкции на большинстве чипов x86 декодируются до того, как они будут кэшированы, а не после. Это неправда. Они кэшируются перед декодированием. Я полагаю, что у Pentium 4 был дополнительный кэш трассировки, который кэшировался после декодирования, но его больше не выпускают. - person Nathan Fellman; 23.04.2010
comment
это неправда, новейшие процессоры Sandy Bridge используют своего рода кеш трассировки (как у Pentium 4, ох уж этот старичок :D ), так что технологии уходят и возвращаются... - person Quonux; 18.04.2011

Помимо причин, которые люди уже упоминали:

  • В x86-16 была довольно странная схема адресации памяти, которая позволяла адресовать одну ячейку памяти в до 4096 различных способов, ограничение оперативной памяти до 1 МБ и вынуждают программистов иметь дело с указателями двух разных размеров. К счастью, переход на 32-разрядную версию сделал эту функцию ненужной, но чипы x86 по-прежнему несут в себе основную часть сегментных регистров.
  • Хотя это и не является ошибкой x86 как таковой, соглашения о вызовах x86 не были стандартизированы, как MIPS (в основном потому, что MS-DOS не поставлялась с компиляторами), оставляя нас с беспорядком __cdecl, __stdcall , __fastcall и т. д.
person dan04    schedule 21.04.2010
comment
Хм... когда я думаю о конкурентах x86, я не думаю о MIPS. ARM или PowerPC, может быть.... - person Billy ONeal; 23.04.2010
comment
@Billy: x86 существует почти всегда. Одно время MIPS был конкурентом x86. Насколько я помню, над x86 пришлось потрудиться, чтобы выйти на уровень, на котором он мог бы конкурировать с MIPS. (Во времена, когда MIPS и SPARC боролись на арене рабочих станций.) - person Shannon Severance; 18.06.2010
comment
@Shannon Severance: То, что что-то когда-то было, не означает, что что-то есть. - person Billy ONeal; 18.06.2010
comment
Начало восьмидесятых было эпохой, когда миникомпьютеры представляли собой 16-битные PDP от DEC. VAX только появился, а вместе с ним и эпоха супермини: процессоры миникомпьютеров внезапно стали 32-битными, того же размера, что и мейнфреймы IBM. Так что рискну сказать, что тогда 1 Мб памяти был ОГРОМНЫМ. Тот факт, что это можно было сделать для 16-битного процессора, был прекрасен. Неуклюжий для 20-20 дальновидных задним числом. Память 8086 тоже не сразу заполнялась. Я думаю, что это работало довольно (или почему не очень) хорошо в своем историческом контексте. - person Olof Forshell; 08.12.2010
comment
@OlofForshell: мне еще предстоит найти 16-битный процессор, который может получить доступ к 128 КБ данных так же чисто, как 8086 может получить доступ к 1 МБ. - person supercat; 11.06.2013
comment
@supercat: люди в эпоху плоской модели памяти x86-32 склонны забывать, что 16 бит означают 64 КБ памяти (любой, кто потрудится заняться математикой, поймет, что магия невозможна, что 8086 не был неприятное наказание для ничего не подозревающих программистов). Есть несколько способов обойти 64k, но решение 8086 было хорошим компромиссом. - person Olof Forshell; 12.06.2013
comment
@OlofForshell: я думаю, что многие люди оплакивали тот факт, что 8086 не был так хорош, как 68000 (у которого было 16 МБ линейного адресного пространства и четкий путь к 4 гигабайтам). Конечно, переход на 32-разрядный процессор облегчит доступ к более чем 64 КБ, но 8086 — это 16-разрядная архитектура, которая была разработана как шаг вперед по сравнению с 8-разрядным 8080. напрямую с 8-битной на 32-битную. - person supercat; 12.06.2013
comment
@OlofForshell: Между прочим, Macintosh работал на 68000, но его ОС накладывала множество ограничений на 32 КБ в тех случаях, когда на 8086 были бы ограничения на 64 КБ. Такие ограничения были результатом разумных конструктивных решений (например, было лучше сохранить два байта на строку в полях редактирования текста, чем позволить одному текстовому полю использовать четверть памяти машины), но они указывают на то, что использование 32-разрядной процессор не панацея. - person supercat; 12.06.2013

Я думаю, вы получите часть ответа, если когда-нибудь попытаетесь написать компилятор, ориентированный на x86, или если вы напишете эмулятор машины x86, или даже если вы попытаетесь внедрить ISA в аппаратное обеспечение.

Хотя я понимаю "x86 некрасиво!" аргументы, я по-прежнему думаю, что весело писать ассемблер x86, чем MIPS (например) - последнее просто утомительно. Это всегда предназначалось для компиляторов, а не для людей. Я не уверен, что чип мог бы быть более враждебным по отношению к авторам компиляторов, если бы попытался...

Самое неприятное для меня — это то, как работает сегментация (в реальном режиме): любой физический адрес имеет 4096 псевдонимов сегмент: смещение. Когда в последний раз вам это было нужно? Все было бы намного проще, если бы часть сегмента была строго старшими битами 32-битного адреса.

person Bernd Jendrissek    schedule 14.05.2010
comment
m68k намного забавнее и приятнее для людей, чем x86 (который не может показаться таким человечным для многих программистов m68k), если правильный PoV - это то, как человек может писать код в этих сборках. - person ShinTakezou; 20.06.2010
comment
Сегментная адресация со смещением была попыткой сохранить до некоторой степени совместимость с миром CP/M. Одно из худших решений. - person Turing Complete; 30.06.2010
comment
@Turing Complete: segment:offset НЕ был в первую очередь попыткой сохранить совместимость с миром CP/M. Это была очень успешная попытка позволить 16-битному процессору адресовать более 64 КБ, размещая код, данные, стек и другие области памяти в разных сегментах. - person Olof Forshell; 14.01.2011
comment
На самом деле размещение данных и стека в разных сегментах было совершенно бесполезным для C; его можно было использовать только для asm. В C указатель может указывать на данные со статической, автоматической или динамически выделяемой продолжительностью хранения, поэтому нет возможности исключить сегмент. Может быть, это было полезно для Паскаля или Фортрана или чего-то еще, но не для Си, который в то время уже был доминирующим языком... - person R.. GitHub STOP HELPING ICE; 21.07.2011
comment
@R..: данные и стек в разных сегментах были совершенно бесполезны для C - это настолько далеко от истины, насколько вы можете себе представить. В многопоточных (особенно с несколькими ядрами/процессорами) приложениях важно, чтобы каждый поток имел свой собственный стек (содержащий информацию о вызовах, локальные переменные и т. д.). Совместное использование одних и тех же сегментов данных позволяет нескольким потокам одновременно работать с одними и теми же данными. Это хорошо и процветает в многопоточных приложениях для приложений NT-движка и, я подозреваю, в приложениях Linux. - person Olof Forshell; 03.08.2011
comment
@Olof: в многопоточной программе все адресное пространство является общим. Указатель на локальную переменную в стеке потока A должен быть действителен в потоке B. Это невозможно, если вы использовали сегменты для выполнения волшебства предоставления каждому потоку собственного стека. Это легко, если у вас просто есть разные указатели стека для каждого потока. - person R.. GitHub STOP HELPING ICE; 03.08.2011
comment
@R.. OTOH, сегментация - это именно то, что позволяет реализовать x86 локальное хранилище потока: для доступа к нему используются FS и GS. Повозившись с LDT, ядро ​​может настроить потоки таким образом, чтобы их дескрипторы FS и GS имели разную базу сегментов, но использовали одно и то же значение селектора. - person Bernd Jendrissek; 06.08.2011
comment
@Bernd: Причина, по которой fs / gs была выбрана для локального хранилища потока, заключается не в том, что для этого подходят сегментные регистры. Просто х86 сильно не хватало регистров, а сегментные регистры не использовались. Регистр общего назначения, указывающий на структуру потока, работал бы так же хорошо, и на самом деле многие RISC-системы с большим количеством регистров используют один в качестве указателя потока. - person R.. GitHub STOP HELPING ICE; 06.08.2011
comment
Если бы Intel включила FS и GS в 8086, разрешила прямую загрузку сегментных регистров и, возможно, добавила пару инструкций по нормализации эффективных адресов, я бы расценил стиль сегмент + смещение как значительно превосходящий любой другой подход, который я видел для предоставление 16-разрядному процессору доступа к 1 МБ адресного пространства. На самом деле, даже без этих функций, я все еще думаю, что это лучше, чем что-либо еще, что я видел с тех пор [кроме, очевидно, перехода на 32-битные регистры]. Кроме того, в объектно-ориентированной среде линейная адресация не так уж и хороша. - person supercat; 11.06.2013
comment
Немногим приложениям требуется более двух миллиардов различных объектов или требуется, чтобы отдельные объекты превышали два гигабайта. Большинство приложений, которым может потребоваться более двух миллиардов объектов, возможно, работали бы лучше, если бы использовали меньшее количество более крупных объектов; большинству приложений, которым потребуется объект размером более 2 гигабайт, вероятно, было бы полезно, если бы они использовали несколько объектов меньшего размера. Ни один из известных мне режимов сегментации 8x86 не предназначен для работы с более чем 65 536 сегментами, но объектно-ориентированная среда, использующая сегмент для каждого объекта, может использовать 32-битные идентификаторы объектов, а не 64. - person supercat; 11.06.2013
comment
@R..: да, в многопоточной программе все адресное пространство является общим, включая область, используемую стеками. Я не понимаю рассуждений, когда вы говорите об указателе в стеке одного потока, доступном другим потокам. Это локальное хранилище в том смысле, что у каждого потока есть собственный LIFO. Если потоки начинают возиться с содержимым стеков друг друга, результатом обычно становится хаос. - person Olof Forshell; 12.06.2013
comment
@OlofForshell: обычно, особенно если вызывающий объект не вернется в родительский поток до завершения дочерних потоков (например, многопоточная функция сортировки), аргументы/данные для дочерних потоков будут расположены в родительском потоке. куча. В этом нет ничего хаотичного. Более того, если библиотечная функция реализована внутренне с потоками и использует указатели, потоки должны иметь возможность разыменовывать любой действительный указатель, переданный вызывающей стороной. В противном случае вызывающая сторона должна была бы знать, что могут быть переданы только указатели на статические или динамические объекты хранения. - person R.. GitHub STOP HELPING ICE; 12.06.2013
comment
@R..: 8086 был представлен в конце семидесятых. C не был доминирующим языком в то время. Intel предполагала, что их процессоры будут использоваться во встроенных системах и программироваться на ассемблере. У Intel также был язык высокого уровня под названием PL/M и RTOS под названием RMX. C и UNIX едва вышли из Bell Labs. - person Olof Forshell; 13.06.2013

  1. x86 имеет очень, очень ограниченный набор регистров общего назначения.

  2. он продвигает очень неэффективный стиль разработки на самом низком уровне (ад CISC) вместо эффективной методологии загрузки/хранения.

  3. Intel приняла ужасающее решение ввести откровенно глупую модель адресации сегмента/смещения памяти, чтобы оставаться совместимой с (уже на данный момент!) устаревшей технологией.

  4. В то время, когда все переходили на 32-битные, x86 сдерживал массовый мир ПК, будучи скудным 16-битным (большинство из них — 8088 — даже только с 8-битными внешними путями данных, что еще страшнее!)


Для меня (и я ветеран DOS, который видел каждое поколение ПК с точки зрения разработчиков!) пункт 3 был худшим.

Представьте себе следующую ситуацию, которая была у нас в начале 90-х (мейнстрим!):

а) Операционная система с безумными ограничениями по устаревшим причинам (640 КБ легкодоступной оперативной памяти) - DOS

б) Расширение операционной системы (Windows), которое могло больше работать с оперативной памятью, но было ограничено, когда дело доходило до таких вещей, как игры и т. д., и не было самой стабильной вещью на Земле (к счастью, это изменилось позже, но я я про начало 90-х)

c) Большая часть программного обеспечения все еще была DOS, и нам приходилось часто создавать загрузочные диски для специального программного обеспечения, потому что был этот EMM386.exe, который некоторым программам нравился, другим ненавидели (особенно геймерам - а я в то время был AVID геймером - знаете, что я я про вот это)

г) Мы были ограничены MCGA 320x200x8 бит (ладно, там было немного больше со специальными ухищрениями, 360x480x8 было возможно, но только без поддержки библиотеки времени выполнения), все остальное было грязно и ужасно ("VESA" - лол)

д) Но с точки зрения железа у нас были 32-битные машины с несколькими мегабайтами ОЗУ и картами VGA с поддержкой до 1024x768.

Причина такой плохой ситуации?

Простое дизайнерское решение Intel. Уровень машинных инструкций (НЕ двоичный уровень!) Совместимость с чем-то, что уже умирало, я думаю, что это был 8085. Другие, казалось бы, не связанные проблемы (графические режимы и т. д.) были связаны с техническими причинами и из-за очень узкого Недалеко мыслящую архитектуру платформа x86 принесла с собой.

Сегодня ситуация иная, но спросите любого разработчика ассемблера или людей, которые создают серверные части компилятора для x86. Безумно малое количество регистров общего назначения — не что иное, как ужасный убийца производительности.

person Turing Complete    schedule 30.06.2010
comment
Единственная серьезная проблема с сегментированной архитектурой 8086 заключалась в том, что существовал только один неспециализированный сегментный регистр (ES) и что языки программирования не были предназначены для эффективной работы с ним. Используемый стиль масштабируемой адресации будет очень хорошо работать в объектно-ориентированном языке, который не предполагает, что объекты могут начинаться с произвольных адресов (если объекты выравниваются по границам абзаца, ссылки на объекты должны быть только двухбайтовыми, а не четыре). Если сравнить ранний код Macintosh с кодом ПК, 8086 на самом деле выглядит довольно хорошо по сравнению с 68000. - person supercat; 09.02.2014
comment
@supercat: на самом деле регистр es БЫЛ посвящен чему-то, а именно тем строковым инструкциям, которые требовали сохранения (movs, stos) или сканирования (cmps и scas). Учитывая адресацию 64 КБ из каждого сегментного регистра, es также предоставил недостающую ссылку на память, отличную от кода, данных и памяти стека (cs, ds, ss). Сегментные регистры обеспечивали своего рода схему защиты памяти, поскольку вы не могли обращаться к блокам памяти размером 64 КБ за пределами регистров. Какое лучшее решение вы предлагаете, учитывая, что x86 была 16-битной архитектурой и ограничениями литографии того времени? - person Olof Forshell; 05.02.2016
comment
@OlofForshell: ES использовался для строковых инструкций, но его можно было использовать как незафиксированный регистр для кода, который их не использует. Способ облегчить узкое место seg-reg, не требуя слишком много места для кода операции, состоит в том, чтобы иметь префикс rseg, который указывал бы, что для следующей инструкции формата r/m поле r будет выбирать из CS/SS/DS/ES/FS. /ГС/??/?? вместо AX/BX/CX/DX/SI/DI/SP/BP и иметь префиксы для FS/GS и инструкции для LFS и LGS (например, LDS и LES). Я не знаю, как была заложена микроархитектура для 8086, но я думаю, что-то подобное могло бы сработать. - person supercat; 05.02.2016
comment
@supercat: как я уже писал, регистры es также предоставляют недостающую ссылку на память, кроме ... Fs и gs не появлялись до 386, насколько я помню. - person Olof Forshell; 05.02.2016
comment
@OlofForshell: они этого не сделали, что сделало архитектуру 80286 даже хуже, чем архитектура 8086 во многих отношениях. Я хотел сказать, что добавление еще пары сегментных регистров (или даже одного, если уж на то пошло) сделало бы архитектуру 8086 намного более полезной, а набор инструкций мог бы быть чище и полезнее, если бы доступ к регистрам сегментов был таким же, как другие. - person supercat; 05.02.2016
comment
@supercat: мы обсуждаем то, что произошло тридцать пять лет назад с рождением самой успешной в мире компьютерной архитектуры. Я написал несколько действительно хорошо работающих программ для IBM PC, которые смешали ассемблер и PL/M-86, и я действительно не знаю, как 8086 или 80286 стали бы более полезными, если бы у них был дополнительный сегментный регистр. Я был совершенно доволен тем, что у меня было более 64 КБ для работы. У многих программистов были проблемы с сегментацией 8086 (я думаю, что они боролись с ней, вместо того, чтобы просто принять ее и продолжить работу) - я не был одним из них. - person Olof Forshell; 05.02.2016
comment
@OlofForshell: для многих приложений отсутствие регистров сегментов было серьезным узким местом; при использовании машинного кода можно было обойти это, поместив таблицы перевода в сегмент кода и заставив некоторые функции принимать указатели на данные, которые должны были быть в стеке, и производительность в целом была достаточно хорошей, но дополнительные сегментные регистры очень помогли бы . На самом деле, моя большая претензия к 80386 заключается в том, что они оставили регистры сегментов 16-битными, что делает невозможным идентифицировать объекты, используя только сегмент. - person supercat; 05.02.2016
comment
Формирование адресов с использованием сегмента + смещения может обеспечить чрезвычайно эффективную объектно-ориентированную структуру, если сегментная часть адреса достаточна для уникальной идентификации объектов. Использование 32-разрядных ссылок на объекты позволило бы повысить эффективность кэширования по сравнению с использованием 64-разрядных, а наличие 32-разрядных идентификаторов сегмента и масштабированного смещения позволило бы поддерживать объекты общим объемом более 4 ГБ. - person supercat; 05.02.2016
comment
@supercat: вы прыгаете туда-сюда между x86-16 и -32, за этим действительно сложно уследить. В одну минуту я подумал, что мы обсуждаем плюсы и минусы исходного (реального режима) x86-16 — истоков современной архитектуры ПК — и вдруг вы обсуждаете 4 ГБ и эффективность кэша. Пожалуйста, будьте более краткими и не смешивайте несовместимые темы. - person Olof Forshell; 06.02.2016
comment
@OlofForshell: я думаю, что концепция 8086, заключающаяся в наличии сегментных регистров, которые представляют масштабированные базовые адреса для указателей без необходимости иметь отдельные дескрипторы для каждого такого адреса, была хорошей, которая работала исключительно хорошо на 8086; схема сегментации на 80286 была гораздо менее полезной, а на 80386 сегменты в значительной степени игнорировались, хотя - если бы они были реализованы способом, более близким к 8086, они могли бы позволить гораздо больше сделать с 32-битными приложениями. . - person supercat; 07.02.2016