Почему в проце так мало регистров общего назначения, чем это обусловлено, смотря ассемблерные листинги удивляешся как компилятор обходится таким количеством, постоянно пересылая значения из памяти в регистр и обратно пытаясь ускорить работу сними, ведь если добавить десяток аккумуляторов все вычисления над переменными можно выполнять в регистрах, не используя доступ к медленной памяти. P.S Возможно ли большее кол-во регистров технически, или надо сказать интелловцам спасибо хоть за этот набор регистров? P.P.S сорри за бестолковый вопрос
Изначально регистры были не совсем общего назначения: ax - аккумулятор, bx - базовый, для функций типа xlat, cx - счетчик, dx - для данных, si, di - для строковых операций и т.д. И этим набором вполне ограничивались. Ну а сейчас, в начале эпохи 64-битных процессоров, в них (в процессорах x64) уже и появляются дополнительные регистры r9 там, r8...
Внутренних регистров больше, чем доступных программно. В х64, вот, открыли ещё 8. Если хочется фана, посмотри в сторону Itanium: The Itanium has a large number of registers: * 128 integer registers, each with a NaT bit (r0 - r127) * 128 floating-point registers (f0 - f127) * 64 predicate registers (p0 - p63) * 8 branch registers (b0 - b7) * An instruction pointer (the debugger calls this iip) * 128 other special-purpose registers (not all of which have yet been given meanings). These are called the "application register set," or "ar" registers. (They are not covered in this documentation.) * A number of miscellaneous registers
Значит это директивы типа .386 как раз и ограничивают компилятор только регистрами РОН, а то судя по асм-листингу он доп. регистры не юзает.
igrock Нет, они Не доступны Программно. Хоть .all_registers_for_all_machines поставь - ничего не выйдет.
Реализовать в железе большое число регистров не проблема. Проблема в их адресации в существующей системе команд х86. Для адресации одного из 8 регистров требуется 3 бита, в одной команде может использоваться до 3-х регистров - итого до 9 бит, которые в зависимости от команды и типа адресации "рассовываются" в забитые под завязку байты опкода, ModR\M и SIB. Поэтому в x86-64 ради адресации дополнительных 8 регистров пришлось пожертвовать популярными однобайтовыми командами inc\dec, которые в 64-битном режиме играют роль префиксов REX и ... могут приводить к заметному увеличению объема кода при злоупотреблении дополнительными регистрами От необходимости доступа к медленному ОЗУ никакие регистры не спасут, а часто используемые, "сверхоперативные" данные хранятся в кэше первого уровня со временем доступа 2-3 такта. Резюме: для большинства задач доступных РОН вполне хватает, ну а начинающим "танцорам" всегда что-то мешает и не хватает для полного счастья Доп.регистры можно юзать только в 64-битном режиме (т.е. и проц, и компилер и ОС, под которой будет запускаться прога, д.б. 64-битными)
в risc системах куча регистров, но работа с памятью идет только через регистры, за исключением спец команд загрузки в/из памяти. то есть что-то типа mov eax, [0x10000] не прокатит.
igrock Главная проблема не в том, что регистров мало, а в том, что они имеют узкую специализацию, о чём уже писали. Например, в PDP-11 (была такая мини-ЭВМ, суперпопулярная в 1970-е, отдельные экземпляры до сих пор работают) тоже 8 регистров, из коих один -- указатель стека (SP), а ещё один -- счётчик команд (PC, аналог IP). То есть фактически свободными были всего 6 регистров -- на 1 меньше, чем на интеловских процах. Но они были действительно универсальными, а кроме того, имелась очень удобная система адресации -- и в результате никаких проблем не было. Ну а вообще, интеловская архитектура (что 8-разрядный 8080, что 16-разрядный 8086/8088, что 32-разрядные, начиная с 80386) -- это сплошное уродство... Жаль, что нынешним программистам приходится учить ассемблер на таком дерьме ((
где-то слышал что система команд pdp-11 считается очень хорошей и гораздо лучше существующих, увы сам не работал, а сейчас уже не актуально.
помню набирал команды на каком то PDP (наверное pdp-8) размером с 2 холодильника еще до изучения ассемблера, чесно скажу очень понравилось щелкать рычажками ;P да, именно на таких МАШИНАХ и надо начинать изучать ассемблер, остальное от лукавого P.S. кстати о том что все хвалят архитектуру pdp тоже слышал, видимо действительно легендарная машина была, та же Unix зародилась именно на pdp-шках.
n0name Из 16-разрядных -- лучшая. За счёт очень гибкой адресации, например, нет нужды в командах PUSH/POP, их роль выполняет MOV. Например, вот сохранение регистра R0 в стеке: Код (Text): MOV R0, -(SP) Пересылка строк байтов примерно так будет (R0 - счётчик, R1 - адрес источника, R2 - адрес приёмника): Код (Text): 10$: MOVB (R1)+,(R2)+ SOB R0, 10$ Регистры абсолютно равноправны, за исключением спецфункций регистров 6 и 7 -- указателя стека и счётчика команд соответственно (представляете, как я мучился, переходя на ассемблер 8086 с его узкой специализацией регистров?). Почти все арифметико-логические операции можно выполнять как с операндами в регистрах, так и в памяти, т.е. регистры обязательны только для косвенной адресации. В общем, достоинств, масса, хотя недостатки тоже имеются. Ну а среди 32-разрядных машин лучшая по системе команд -- VAX-11, которая стала развитием PDP-11.
Так, не пойму в чем уродство архитектуры Intel. Пожалуйста - подробный и усчерпывающий список доводов. Далее - не вижу не равноправность регистров. ESP есть как вы сказали и других. PUSH/POP можно также заменить MOV/ADD(SUB), кто мешает(другое дело скорость и/или размер кода)? Да, некоторые многие команды используют неявно многие регистры, но никто не запрещает нам ими пользоватся не забывая конечно об этих неявных зависимостях. А вообще все что пахнет линуксом у меня вызывает рвотный рефлекс.
мм. я согласен что формат команд корявый. например как интересно вводится доп байт сиба, или то что некоторые регистры не могут быть индексом или базой, итд. посмотри 16битный режим.
в абсолютном отсутствии масштабируемости. P.S. не хватает нескольких необходимых инструкций (например "ADD+MUL", "сдвиг+вставка").
ну ясно как - по опкоду. но ведь помоему все это вылевается в преимущество кода в размере - все изза неоднозначной структуры опкода, иначе изза чоткой структуры имели бы кучу (по сравнению с текущей организацией кодирования инструкций) байт для каждого опкода.
совершенно с этим не согласен. почему это они должны быть одной инструкцией? ну линукс влияет, понимаю +)
EvilPhreak Начну с конца. Да, Unix фактически появилась на PDP-11 (именно на этой машине она была написана на Си), но работала преотстойно: тормозила жутко и всё такое прочее. По сравнению, есно, с нормальными осями, "заточенными" под эту машину и написанными на асме -- в частности, RSX-11M и RT-11. Не хватало ни скорости процессора, ни объёма памяти (PDP-11 -- мини-ЭВМ, а не мэйнфрейм), чтобы тянуть ось, написанную на ЯВУ. 1) Узкая специализация ВСЕХ так называемых "регистров общего назначения". Например: а) в командах умножения и деления задействованы регистры AX и DX, заменить их другими регистрами невозможно; б) в строковых операциях задействованы регистры SI и DI; в) в инструкции организации цикла, в операциях многоразрядного сдвига и в префиксах повторения задействован регистр CX; г) косвенная адресация возможна только с использованием регистров SI, DI, BX и BP. Ну и так далее и тому подобное. 2) "Неортогональность" системы команд, то есть неодинаковые режимы адресации, доступные для операндов разных команд (наиболее широкий выбор у MOV, а вот у тех же умножения-деления -- куда меньше). 3) Запутанная схема кодирования команд. 4) Целый набор ляпов при реализации защищённого режима, из-за чего в защищённом режиме 80286 невозможно было выполнять программы, написанные для 8086, а до появления специальных технологий виртуализации невозможно было реализовать нормальную систему виртуальных машин (возможна была только эмуляция, что связано с огромным падением производительности). 5) Ляпы с совместимостью снизу вверх, которой в полном объёме нет, хотя никаких реальных причин не сделать её не было (разница в команде PUSHA, в командах сдвига, ещё в чём-то там). n0name Так и в 32-разрядном равноправности нет. Кой-что смягчили, но в общем то же самое и осталось. EvilPhreak Реальных преимуществ это не даёт. У той же PDP-11 все команды были 2-, 4- или 6-байтовыми (все операции "регистр-регистр" -- двухбайтовые). Да, какие-то операции получались в результате несколько длиннее, но суммарный размер программ оказывался меньше (особенно с учётом равноправия регистров, из-за чего их не приходилось постоянно запихивать в стек и извлекать их оттуда). Кроме того, чёткая схема кодирования команд резко упрощает их выборку из памяти и декодирование, а это прямо сказывается на сложности и производительности процессора.
EvilPhreak Причём здесь линукс, лично мне неясно. Правда, я не соглашусь, что это необходимые инструкции, но в определённых задачах (например, обработки изображений или оцифрованных аналоговых сигналов) чрезвычайно полезные.