Это в первую очередь пережиток прошлого, но и не совсем устаревший.
В первые дни (т.е., на Intel 8088) Набор регистров x86 на самом деле был гораздо более специализированным, как и другие современные процессоры CISC. (Сам дизайн 8088 произошел непосредственно от Intel 8080 и Zilog Z80. То есть не все 8 регистров были универсальными, как сегодня (функционально). Было много инструкций, которые работали только с жестко запрограммированными регистрами. Это означало, что программисты часто перемещали значения между регистрами, чтобы правильно настроить следующую инструкцию.
EAX был особым регистром. Что ж, на самом деле, в те дни он был известен как AX, поскольку он был всего 16 бит и еще не был E расширен до 32 бит. AX - это накопитель A, который использовался в качестве жестко запрограммированного пункта назначения множеством различных инструкций. аккумулятор - это регистр, в котором хранятся промежуточные результаты - в нем накапливаются результаты логических и арифметические операции. Практически все ранние микропроцессоры имели регистр аккумулятора, и многие из них заставляли использовать аккумулятор таким образом. Архитектура x86 во многих случаях была более гибкой, но все же вдохновлялась этим дизайном. Подробное описание логики набора регистров x86 находится здесь.
Эти особые варианты общих инструкций являются следствием такой конструкции. Это короткие (всего 1 байт), быстрые (в основном из-за небольшого размера инструкций, но, по-видимому, также были оптимизации на уровне кремния и в первые дни) способы взаимодействия со значениями в регистре аккумулятора.
Так что да, это как раз способ сэкономить место для кода, и да, он по-прежнему более эффективен, чем кодирование общего регистра, именно потому что требуется меньше байтов для кодирования инструкций. Небольшой размер кода сегодня не так важен, как это было с 8088, конечно, учитывая наши значительно большие кеши инструкций и более высокую скорость чтения памяти, но это все равно имеет значение. Любой хороший программист на ассемблере x86 знает, что по возможности лучше использовать эти короткие инструкции, основанные на аккумуляторе, и многие компиляторы тоже. Это особенно важно во внутренних циклах, где уменьшение размера кода имеет решающее значение для обеспечения того, чтобы все оставалось в кеше. Использование регистров и даже поток кода часто тщательно переоцениваются и перестраиваются, чтобы сохранить в аккумуляторе как можно больше вещей - даже сегодня - именно так, чтобы можно было использовать эти короткие и эффективные коды операций.
См. Также: Отличные советы Питера Кордеса для игры в гольф в Машинный код x86 / x64, в котором содержится более подробная информация о коротких кодировках.
person
Cody Gray
schedule
24.06.2016