CISC- и RISC-архитектура: определение, особенности машинного языка, преимущества и ограничения; пример машинного кода программы на C для процессора Intel x86 (CISC-архитектура) и процессора ARM (RISC-архитектура).
Как мы убедились выше, различные архитектуры процессоров могут заметно отличаться, но задача повышения быстродействия разумной ценой актуальна для любых архитектур. В рамках этой лекции мы рассмотрим две распространённые архитектуры процессоров - RISC и CISC.
Традиционный подход к проектированию процессоров ставил одной из главных задач эффективную аппаратную реализацию часто встречающихся операций и удобство написания программ на языке ассемблера и машинного языка. Этот подход называется CISC-архитектурой (Complicated Instruction Set Computer); данный термин переводится как "компьютер со сложной системой команд".
CISC-архитектура характеризуется большим количеством разнообразных команд, способных выполнять сложные, многошаговые действия.
При использовании данного подхода система команд и машинный язык обладали следующими свойствами.
В качестве примеров процессоров, имеющих CISC-архитектуру, укажем на процессоры знаменитых менфреймов IBM System/360, а также на процессоры семейства Intel x86.
Теперь перечислим недостатки CISC-архитектуры.
Многие CISC-процессоры реализуют сложные команды с помощью микрокода - специализированного машинного языка, позволяющего задавать последовательность действий (микроопераций), выполняемую одной машинной командой процессора. Таким образом команды CISC-процессоров оказываются настолько сложными, что их приходится описывать при помощи дополнительного машинного языка, который исполняется специализированным процессором внутри процессора.
RISC-архитектура (Reduced Instruction Set Computer) была нацелена на решение этих проблем.
RISC-архитектура процессора подразумевает небольшую систему команд с тем, что каждая команда имеет эффективную аппаратную реализацию, а сложные операции, необходимые для прикладных программ, составляются из множества этих простых команд.
Вот основные свойства процессоров с RISC-архитектурой.
RISC-архитектур одна команда занимает одно машинное слово. Таким образом имеется простой и "единообразный" машинный язык.RISC-процессорах имеется некоторое количество сложных команд, время исполнения которых может существенно превышать стандартное, например, умножение и деление. Эти операции сложнее, чем сложение и вычитание: они требуют выполнения большого количества сдвигов, сложений/вычитаний и различных проверок. Поскольку такие команды выбиваются из стройной концепции RISC, для их реализации применяют специальные приёмы. В частности, команда деления исполняется асинхронно - само деление далее выполняется отдельным специальным блоком процессора, в то время как сам процессор исполняет другие команды. При этом исполняемая программа "знает", через сколько тактов деление завершится, и также знает, где (в каких регистрах) будут расположены частное и остаток от деления.Ценой потери выразительности и экономности машинного языка процессоры с RISC-архитектурой достигают следующих преимуществ по сравнению с CISC-процессорами.
Чтобы наглядно проиллюстрировать разницу между CISC- RISC- архитектурами, рассмотрим следующий пример. Команда сложения (add) в процессорах семейства Intel x86 (CISC-архитектура) имеет два аргумента - первое и второе слагаемое, а результат исполнения команды помещается на место первого слагаемого. При этом любое из слагаемых может быть или регистром, или числом, хранящимся в оперативной памяти. Все возможные сочетания типов аргументов соответствуют различным командам add. Таким образом, в процессорах Intel x86 имеется три разных команды add: регистр/регистр, регистр/память, память/регистр. Команды add типа память/память у процессоров Intel x86 отсутствует, поскольку в рамках выполнения арифметических команд предполагается не более одного обращения к памяти. Это обусловлено преемственностью в рамках семейства Intel x86: в первых процессорах семейства (Intel 8086 и Intel 8088) несколько обращений к данным в оперативной памяти существенно замедлили бы реализацию арифметики и потребовали бы усложнения процессора. Следует отметить, что кроме вышеперечисленных команд сложения у процессоров Intel x86 имеется и другие команды add, которые предназначены для работы с константами, для использования разных вариантов адресации и пр.
В RISC-процессоре имеется одна команда add, и она работает только с регистрами, то есть имеет вид регистр/регистр. Если одно из слагаемых находится в памяти, то оно сначала в явном виде (то есть отдельной командой) должно быть загружено в соответствующий регистр, а уже потом должна быть вызвана команда сложения. Вместо этих двух команд в процессорах Intel x86 просто вызывается соответствующая команда add, которая сначала загружает недостающий операнд из памяти в процессор, а потом выполняет сложение.
Данный простой пример показывает, что машинный язык RISC-процессора гораздо менее дружественный для программиста, программирующего на языке ассемблера или в машинном коде, чем машинный язык CISC-процессора, позволяя обходиться меньшим количеством команд за счет гибкости задания аргументов. Но, как мы уже сказали выше, простой машинный язык позволяет упростить и управляющее устройство процессора - блок, ответственный за управление другими блоками процессора. В дополнение к уже упомянутому выше удешевлению процессора, это упрощение дает конструкторам RISC-процессоров ещё одну косвенную выгоду: возможность сделать управляющее устройство процессора более компактным, и, как следствие, сократить время прохождения сигналов внутри него, что позволяет увеличить тактовую частоту процессора.
RISC-архитектура также имеет свои слабые стороны.
CISC-процессоров, усилий по создании компилятором с языков высокого уровня оптимального машинного кода. Современные CISC-процессоры справляются с этим "самостоятельно", хотя и ценой значительного усложнения. Подробнее об этом мы расскажем ниже в разделе о конвейеризации и внеочередном исполнении машинных команд.RISC-процессора получается больше, чем для тех же программ, скомпилированных для CISC-архитектур, то увеличивается нагрузка на шины и на оперативную память ЭВМ.Наиболее известными представителями RISC-архитектуры являются семейства ARM (процессоры этого семейства являются основой многих современных мобильных устройств, а также некоторых персональных компьютеров и даже суперкомпьютеров) и MIPS (наиболее популярны как основа для оборудования вычислительных сетей).
Одним из обстоятельств, повлиявших на популярность RISC-архитектуры (а это был рубеж 1970-х и 80-х годов) стал тот факт, что значительная часть программ к этому времени разрабатывалась на языках высокого уровня, и таким образом с машинным языком уже имели дело компиляторы, а не программисты. Следовательно, необходимость удобного для человека машинного языка (одно из основных преимуществ CISC-архитектуры) стало неактуальным. В то же время RISC-процессоры, хотя и потеснили CISC, но не вытеснили их окончательно. Большинство новых процессоров, разрабатываемых в последние годы, относятся к уже существующим семействам, а большинство этих семейств имеют RISC-архитектуру. Тем не менее, для популярных CISC-семейств процессоров, например, Intel x86 и IBM System/360 (и последующих) разработано такое количество ПО, что отказаться от этих процессоров в пользу других, пусть и более совершенных, уже невозможно по экономическим соображениям. Отметим также, что разработчики современных CISC-процессоров не отказываются от использования отдельных идей RISC. Так, в некоторых процессорах семейства Intel x86 (например, Intel 80486) машинные команды транслируются в последовательности микроопераций, которые уже исполняет "скрытый от программиста" внутренний RISC-процессор.
Чтобы наглядно проиллюстрировать особенности CISC- и RISC-архитектур, приведём пример. В качестве CISC-процессора рассмотрим процессор семейства Intel x86, в качестве RISC-процессора возьмём ARM. Рассмотрим следующую несложную программу на C и покажем, какой машинный код создаётся компилятором для этой программы для CISC- и RISC-процессора:
int a, b; bool res; a = a + b; b = 3 * b; if (a > b) res = true; else res = false;
Для компиляции этой программы под платформу Intel x86 мы использовали компилятор Microsoft Visual C/C++ 19, для ARM - компилятор GNU C Compiler 8. Читатели для тех же целей могут воспользоваться сервисом , который позволяет, не инсталлируя эти компиляторы на свой компьютер, транслировать программы на языках C/С++ под разные архитектуры, и наглядно показывает получившийся код на языке ассемблера, а также в виде машинных команд.
Результаты трансляции для обеих архитектур представлены в рис. 9.1. Для каждого оператора программы на языке C даны команды машинной программы Intel x86 и ARM. Для каждой команды приводится её адрес в оперативной памяти, машинный код (и то, и другое - в шестнадцатеричной записи), а также ассемблерное представление этой команды (для большей наглядности).
Ниже представлены дополнительные пояснения и комментарии к рис. 9.1.
Intel x86 состоит из 11 команд, а для ARM - из 18.Intel x86 именуются символами, например, eax, ecx, а в ARM они обычно нумеруются, например: Это связано с тем, что традиционно у RISC-процессоров арифметических регистров больше, чем у CISC, поскольку первым предпочтительно как можно больше операндов заранее разместить в регистрах с тем, чтобы во время исполнения основных команд не обращаться к оперативной памяти.Intel x86 имеет разную длину - от одного до четырех байтов вместе с операндами, а код команд ARM занимает в памяти по четыре байта. В итоге программа для Intel x86 занимает 34 байта, а для ARM - 72. Эта закономерность сохраняется и для больших программ: машинный код для процессоров ARM обычно в 1,5-2,5 раза объёмнее, чем для Intel x86.Intel x86 компилятор использует умножение (команду imul - умножение целых чисел со знаком), а для ARM умножение заменяется сдвигом и сложением : как уже обсуждалось выше, операция умножения является ресурсоёмкой, поэтому при компиляции программы под RISC-процессор везде, где имеется возможность избежать использования команды машинного умножения, компилятор делает это.Intel x86 в командах безусловного (jmp) и условного (jle) перехода параметр, указывающий, насколько следует "прыгнуть" относительно адреса текущей команды (так называемое смещение), задаётся в байтах (например, jmp .+4 означает: "перепрыгни" через четыре байта машинного кода). У ARM все команды, представленные в виде машинного кода, имеют одинаковую длину - по четыре байта. Поэтому команды перехода (b и ble) оперируют не адресом, а сразу номером команды, соответственно и смещение задаётся не в байтах, а в количестве команд, причём не считая следующей (например,jmp .+1 означает: "перепрыгни" через две команды).Отметим также, что мы намеренно запретили использованным компиляторам оптимизировать программу. При включённых оптимизациях современные компиляторы выполняют много преобразований, которые в нашем случае существенно усложнили бы результирующий код, сделав его непригодным для нашей иллюстративной задачи. Читатели могут в качестве упражнения самостоятельно задать параметры оптимизации и посмотреть на то, что получится в итоге.
CISC-архитектуры.CISC-процессоров.CISC-архитектуры.RISC-архитектуры.RISC-процессоров.RISC-архитектуры.RISC-архитектур.RISC-процессоров не является существенным недостатком?CISC-процессора.CISC- и RISC-процессорами на примере операции сложения. CISC- или RISC-процессоров?CISC- или RISC-процессоров?CISC- или RISC-процессоров?C для CISC-процессора, прокомментируйте результаты трансляции.C для RISC-процессора, прокомментируйте результаты трансляции.CISC- и RISC-архитектура: определение, особенности машинного языка, преимущества и ограничения; пример машинного кода программы на C для процессора Intel x86 (CISC-архитектура) и процессора ARM (RISC-архитектура).
Как мы убедились выше, различные архитектуры процессоров могут заметно отличаться, но задача повышения быстродействия разумной ценой актуальна для любых архитектур. В рамках этой лекции мы рассмотрим две распространённые архитектуры процессоров - RISC и CISC.
Традиционный подход к проектированию процессоров ставил одной из главных задач эффективную аппаратную реализацию часто встречающихся операций и удобство написания программ на языке ассемблера и машинного языка. Этот подход называется CISC-архитектурой (Complicated Instruction Set Computer); данный термин переводится как "компьютер со сложной системой команд".
CISC-архитектура характеризуется большим количеством разнообразных команд, способных выполнять сложные, многошаговые действия.
При использовании данного подхода система команд и машинный язык обладали следующими свойствами.
В качестве примеров процессоров, имеющих CISC-архитектуру, укажем на процессоры знаменитых менфреймов IBM System/360, а также на процессоры семейства Intel x86.
Теперь перечислим недостатки CISC-архитектуры.
Многие CISC-процессоры реализуют сложные команды с помощью микрокода - специализированного машинного языка, позволяющего задавать последовательность действий (микроопераций), выполняемую одной машинной командой процессора. Таким образом команды CISC-процессоров оказываются настолько сложными, что их приходится описывать при помощи дополнительного машинного языка, который исполняется специализированным процессором внутри процессора.
RISC-архитектура (Reduced Instruction Set Computer) была нацелена на решение этих проблем.
RISC-архитектура процессора подразумевает небольшую систему команд с тем, что каждая команда имеет эффективную аппаратную реализацию, а сложные операции, необходимые для прикладных программ, составляются из множества этих простых команд.
Вот основные свойства процессоров с RISC-архитектурой.
RISC-архитектур одна команда занимает одно машинное слово. Таким образом имеется простой и "единообразный" машинный язык.RISC-процессорах имеется некоторое количество сложных команд, время исполнения которых может существенно превышать стандартное, например, умножение и деление. Эти операции сложнее, чем сложение и вычитание: они требуют выполнения большого количества сдвигов, сложений/вычитаний и различных проверок. Поскольку такие команды выбиваются из стройной концепции RISC, для их реализации применяют специальные приёмы. В частности, команда деления исполняется асинхронно - само деление далее выполняется отдельным специальным блоком процессора, в то время как сам процессор исполняет другие команды. При этом исполняемая программа "знает", через сколько тактов деление завершится, и также знает, где (в каких регистрах) будут расположены частное и остаток от деления.Ценой потери выразительности и экономности машинного языка процессоры с RISC-архитектурой достигают следующих преимуществ по сравнению с CISC-процессорами.
Чтобы наглядно проиллюстрировать разницу между CISC- RISC- архитектурами, рассмотрим следующий пример. Команда сложения (add) в процессорах семейства Intel x86 (CISC-архитектура) имеет два аргумента - первое и второе слагаемое, а результат исполнения команды помещается на место первого слагаемого. При этом любое из слагаемых может быть или регистром, или числом, хранящимся в оперативной памяти. Все возможные сочетания типов аргументов соответствуют различным командам add. Таким образом, в процессорах Intel x86 имеется три разных команды add: регистр/регистр, регистр/память, память/регистр. Команды add типа память/память у процессоров Intel x86 отсутствует, поскольку в рамках выполнения арифметических команд предполагается не более одного обращения к памяти. Это обусловлено преемственностью в рамках семейства Intel x86: в первых процессорах семейства (Intel 8086 и Intel 8088) несколько обращений к данным в оперативной памяти существенно замедлили бы реализацию арифметики и потребовали бы усложнения процессора. Следует отметить, что кроме вышеперечисленных команд сложения у процессоров Intel x86 имеется и другие команды add, которые предназначены для работы с константами, для использования разных вариантов адресации и пр.
В RISC-процессоре имеется одна команда add, и она работает только с регистрами, то есть имеет вид регистр/регистр. Если одно из слагаемых находится в памяти, то оно сначала в явном виде (то есть отдельной командой) должно быть загружено в соответствующий регистр, а уже потом должна быть вызвана команда сложения. Вместо этих двух команд в процессорах Intel x86 просто вызывается соответствующая команда add, которая сначала загружает недостающий операнд из памяти в процессор, а потом выполняет сложение.
Данный простой пример показывает, что машинный язык RISC-процессора гораздо менее дружественный для программиста, программирующего на языке ассемблера или в машинном коде, чем машинный язык CISC-процессора, позволяя обходиться меньшим количеством команд за счет гибкости задания аргументов. Но, как мы уже сказали выше, простой машинный язык позволяет упростить и управляющее устройство процессора - блок, ответственный за управление другими блоками процессора. В дополнение к уже упомянутому выше удешевлению процессора, это упрощение дает конструкторам RISC-процессоров ещё одну косвенную выгоду: возможность сделать управляющее устройство процессора более компактным, и, как следствие, сократить время прохождения сигналов внутри него, что позволяет увеличить тактовую частоту процессора.
RISC-архитектура также имеет свои слабые стороны.
CISC-процессоров, усилий по создании компилятором с языков высокого уровня оптимального машинного кода. Современные CISC-процессоры справляются с этим "самостоятельно", хотя и ценой значительного усложнения. Подробнее об этом мы расскажем ниже в разделе о конвейеризации и внеочередном исполнении машинных команд.RISC-процессора получается больше, чем для тех же программ, скомпилированных для CISC-архитектур, то увеличивается нагрузка на шины и на оперативную память ЭВМ.Наиболее известными представителями RISC-архитектуры являются семейства ARM (процессоры этого семейства являются основой многих современных мобильных устройств, а также некоторых персональных компьютеров и даже суперкомпьютеров) и MIPS (наиболее популярны как основа для оборудования вычислительных сетей).
Одним из обстоятельств, повлиявших на популярность RISC-архитектуры (а это был рубеж 1970-х и 80-х годов) стал тот факт, что значительная часть программ к этому времени разрабатывалась на языках высокого уровня, и таким образом с машинным языком уже имели дело компиляторы, а не программисты. Следовательно, необходимость удобного для человека машинного языка (одно из основных преимуществ CISC-архитектуры) стало неактуальным. В то же время RISC-процессоры, хотя и потеснили CISC, но не вытеснили их окончательно. Большинство новых процессоров, разрабатываемых в последние годы, относятся к уже существующим семействам, а большинство этих семейств имеют RISC-архитектуру. Тем не менее, для популярных CISC-семейств процессоров, например, Intel x86 и IBM System/360 (и последующих) разработано такое количество ПО, что отказаться от этих процессоров в пользу других, пусть и более совершенных, уже невозможно по экономическим соображениям. Отметим также, что разработчики современных CISC-процессоров не отказываются от использования отдельных идей RISC. Так, в некоторых процессорах семейства Intel x86 (например, Intel 80486) машинные команды транслируются в последовательности микроопераций, которые уже исполняет "скрытый от программиста" внутренний RISC-процессор.
Чтобы наглядно проиллюстрировать особенности CISC- и RISC-архитектур, приведём пример. В качестве CISC-процессора рассмотрим процессор семейства Intel x86, в качестве RISC-процессора возьмём ARM. Рассмотрим следующую несложную программу на C и покажем, какой машинный код создаётся компилятором для этой программы для CISC- и RISC-процессора:
int a, b; bool res; a = a + b; b = 3 * b; if (a > b) res = true; else res = false;
Для компиляции этой программы под платформу Intel x86 мы использовали компилятор Microsoft Visual C/C++ 19, для ARM - компилятор GNU C Compiler 8. Читатели для тех же целей могут воспользоваться сервисом , который позволяет, не инсталлируя эти компиляторы на свой компьютер, транслировать программы на языках C/С++ под разные архитектуры, и наглядно показывает получившийся код на языке ассемблера, а также в виде машинных команд.
Результаты трансляции для обеих архитектур представлены в рис. 9.1. Для каждого оператора программы на языке C даны команды машинной программы Intel x86 и ARM. Для каждой команды приводится её адрес в оперативной памяти, машинный код (и то, и другое - в шестнадцатеричной записи), а также ассемблерное представление этой команды (для большей наглядности).
Ниже представлены дополнительные пояснения и комментарии к рис. 9.1.
Intel x86 состоит из 11 команд, а для ARM - из 18.Intel x86 именуются символами, например, eax, ecx, а в ARM они обычно нумеруются, например: Это связано с тем, что традиционно у RISC-процессоров арифметических регистров больше, чем у CISC, поскольку первым предпочтительно как можно больше операндов заранее разместить в регистрах с тем, чтобы во время исполнения основных команд не обращаться к оперативной памяти.Intel x86 имеет разную длину - от одного до четырех байтов вместе с операндами, а код команд ARM занимает в памяти по четыре байта. В итоге программа для Intel x86 занимает 34 байта, а для ARM - 72. Эта закономерность сохраняется и для больших программ: машинный код для процессоров ARM обычно в 1,5-2,5 раза объёмнее, чем для Intel x86.Intel x86 компилятор использует умножение (команду imul - умножение целых чисел со знаком), а для ARM умножение заменяется сдвигом и сложением : как уже обсуждалось выше, операция умножения является ресурсоёмкой, поэтому при компиляции программы под RISC-процессор везде, где имеется возможность избежать использования команды машинного умножения, компилятор делает это.Intel x86 в командах безусловного (jmp) и условного (jle) перехода параметр, указывающий, насколько следует "прыгнуть" относительно адреса текущей команды (так называемое смещение), задаётся в байтах (например, jmp .+4 означает: "перепрыгни" через четыре байта машинного кода). У ARM все команды, представленные в виде машинного кода, имеют одинаковую длину - по четыре байта. Поэтому команды перехода (b и ble) оперируют не адресом, а сразу номером команды, соответственно и смещение задаётся не в байтах, а в количестве команд, причём не считая следующей (например,jmp .+1 означает: "перепрыгни" через две команды).Отметим также, что мы намеренно запретили использованным компиляторам оптимизировать программу. При включённых оптимизациях современные компиляторы выполняют много преобразований, которые в нашем случае существенно усложнили бы результирующий код, сделав его непригодным для нашей иллюстративной задачи. Читатели могут в качестве упражнения самостоятельно задать параметры оптимизации и посмотреть на то, что получится в итоге.
CISC-архитектуры.CISC-процессоров.CISC-архитектуры.RISC-архитектуры.RISC-процессоров.RISC-архитектуры.RISC-архитектур.RISC-процессоров не является существенным недостатком?CISC-процессора.CISC- и RISC-процессорами на примере операции сложения. CISC- или RISC-процессоров?CISC- или RISC-процессоров?CISC- или RISC-процессоров?C для CISC-процессора, прокомментируйте результаты трансляции.C для RISC-процессора, прокомментируйте результаты трансляции.Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.