Почему инструкция lea названа для адресации памяти, когда она просто выполняет арифметику?

lea инструкция ("эффективный адрес загрузки") берет адрес памяти первого значения и добавляет его ко второму значению, которое можно умножить. Затем он загружает этот адрес памяти в заданный регистр.

Позвольте мне привести пример, чтобы прояснить мою путаницу:

eax = 2
leal (%eax, %eax, 4), %edx

Я считаю, что результатом этого является то, что edx будет иметь значение 10 внутри него (2 + 2 * 4 == 10). Но зачем эта инструкция для адресов памяти, если она просто выполняет арифметику с целыми числами?

Я читал другие ответы, но все они говорят о том, что адреса памяти являются единственными. Может кто-нибудь помочь мне понять, что leal делается?

3 ответа

Он назван по назначению.

Большинство инструкций включают одинаковые режимы адресации. Архитекторы ЦП называют работу по определению адреса памяти, выбранного режимами адресации, "вычислением эффективного адреса".

Цель инструкции - внести эффективный адрес в реестр. Следовательно, "загрузить эффективный адрес".

Да, это правда "он просто выполняет арифметику". Если вы подумаете об этом, это почти все, что делает процессор, так что эта фраза не очень описывает какую-либо конкретную инструкцию или активность процессора.

Если вы хотите понять, как много инструкций получают свои имена (не говоря уже о том, какова цель инструкции), рекомендуется взять урок компьютерной архитектуры.

[Изменить после длинного комментария, ниже]:

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

Однако, поскольку инструкция на самом деле не использует вычисленный "адрес", другим чрезвычайно распространенным использованием инструкции LEA является просто выполнение арифметики, которую она выполняет. По сути, LEA, рассматриваемый с этой точки зрения, представляет собой комбинацию вычислительных сумм или произведений с некоторыми специальными небольшими константами и сохраняет результат в другом регистре, не затрагивая биты условия. Это также происходит очень быстро по сравнению с реальным умножением. Полезность этого в реальных программах удивительно высока; получите некоторый опыт написания ассемблерного кода на x86, и вы в это поверите.

Таким образом, LEA можно использовать, например, для умножения регистра на 5 и добавления большой константы. Здесь имя инструкции только смущает; к сожалению, у него все еще должно быть имя.

Добро пожаловать на сайт с кодами ассемблера, где дизайнеры изобретают инструкции для достижения одной цели, а программисты обнаруживают, что они могут использовать инструкции для вычисления вещей, которые дизайнеры явно не рассматривали. [Инструкция AND-немедленное довольно удобна для вычисления по модулю некоторой степени двойки, как другой пример]. Таким образом, каждая инструкция в рациональном наборе команд была помещена туда архитектором инструкций, потому что она служит некоторой полезной цели. И это используется для этого и других вещей, так как кодеры открывают умные приложения.

Причина, по которой LEA работает так, как она работает, заключается в том, что в исходном коде 8086 инструкция LEA повторно использовала аппаратное обеспечение для вычисления эффективного адреса процессора. Аппарат эффективного адреса вычисляет адрес, на который действует операнд памяти инструкции. Поскольку существует ряд различных основных операций, которые необходимо выполнить для вычисления эффективного адреса, это означает, что относительно много энергии было упаковано в LEA инструкция. Большинство "настоящих" арифметических команд выполняют только одну операцию за раз, и большинство требует, чтобы регистр назначения был одним из исходных операндов. Так как он может быть реализован с небольшим дополнительным пространством кодирования и кремниевой областью, это было довольно дешево, учитывая, на что он способен.

Так что инструкция вроде MOV AX,[BX + SI] (Я использую синтаксис Intel здесь) загружает AX с 16-битным значением, сохраненным по адресу, вычисленному путем сложения BX а также SI, Инструкция LEA AX,[BX + SI] грузы AX с адресом, рассчитанным путем добавления BX а также SI, Другими словами, инструкция LEA обрабатывает операнды памяти иначе, чем другие инструкции. Вместо этого работая с памятью по адресу, указанному операндом памяти, он использует вычисленный адрес непосредственно в качестве операнда. Для обеих команд используется одинаковое кодирование адресов, инструкция LEA просто настраивает интерпретацию операнда памяти.

Другими словами, LEA называется так, потому что это именно то, что он делает. Он загружает эффективный адрес, заданный операндом памяти, в регистр назначения. Так как операнд памяти фактически не используется как операнд памяти, он фактически работает как обычная арифметическая инструкция. Если ADD является дополнительной арифметической инструкцией, то LEA является эффективной адресной арифметической инструкцией.

Простой ответ, почему lea Ссылка на понятие эффективных адресов в его названии заключается в том, что он предназначен для расчета эффективных адресов. Имена и намерения часто идут вместе (хотя я хотел бы, чтобы они делали это чаще - есть бесконечные примеры излишне неясной терминологии в этой области).

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

Возможно, лучше мнемоника была бы cea, "рассчитать эффективный адрес". Ну что ж.

Другие вопросы по тегам