Какое значение имеют операции с регистром EAX, имеющим собственные коды операций?

Если вы посмотрите документацию по операциям вроде cmp, _ 2_, add < / a>, sub и _ 5_, вы заметите, что операции, которые включают регистр EAX и его 16- и 8-битные варианты в качестве первого операнда, имеют отдельный код операции, который отличается от общего случая версия этой инструкции.

Является ли этот отдельный код операции просто способом экономии места для кода, он вообще более эффективен, чем код операции общего случая, или это просто пережиток прошлого, от которого не стоит избавляться по соображениям совместимости?


person Govind Parmar    schedule 24.06.2016    source источник
comment
Совершенно другие цели дизайна в 1976 году. 64 КБ ОЗУ стоили руки и ноги, а 1 МБ был будущим, о котором можно было только мечтать. Так продолжалось почти 20 лет. Инструкции с AX в качестве неявного операнда занимают на 1 байт меньше.   -  person Hans Passant    schedule 24.06.2016


Ответы (1)


Это в первую очередь пережиток прошлого, но и не совсем устаревший.

В первые дни (т.е., на 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
comment
Часто константы умещаются в imm8, а add r/m32, imm8 короче add eax, imm32. Но если у вас есть большая константа, например битовая маска для test, то да, вы можете сэкономить место, поместив данные в eax. Поэтому лучший выбор для того, что хранить eax, - это не всегда данные, которые используются чаще всего, а данные, которые используются с наиболее большими константами. Спасибо за эту ссылку на статью Уильяма Свенсона об именовании / назначении регистров, BTW. Я добавил это в вики-страницу по тегам x86. (который сейчас немного раздувается ...) - person Peter Cordes; 24.06.2016
comment
Также касается re: варианты дизайна короткой кодировки и история 8086: этот ответ на Советы по игре в гольф в машинном коде x86 / x64 содержит гораздо более подробную информацию о кодировках коротких форм (включая op al, imm8, xchg ax, reg и т. д.) - person Peter Cordes; 08.10.2020