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

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

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

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

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

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

Ответ 1

Причина, по которой 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 является эффективной арифметической инструкцией адреса.

Ответ 2

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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