Новичек в ассемблере. Начинаю потихоньку разбираться. Не могу понять смысл команды "LEA". Почему скажем просто не пересылать адрес переменной в регистр командой MOV ? Например: есть локальная переменная которая находится по адресу ebp+8. В коде дизассемблированной С-программы нашел инструкцию lea ecx,[ebp+8] почему скажем не загрузить в ecx вычисленное выражение "ebp+8" командой mov ? Читал Intel Architectures Software Developer's Manual что касается описания этой команды. Понятней не стало.
Да можно и через mov. Только тогда вместо "lea ecx, [ebp+8]" нужно написать это: Код (Text): mov ecx, ebp add ecx, 8 Смысл тот же, но lea короче и понятнее выходит. Не путать только с "mov ecx, [ebp+8]" – эквивалентом такой инструкции будет следующее: Код (Text): mov ecx, ebp add ecx, 8 mov ecx, [ecx]
LEA переносит вычисленный адрес операции в регистр что ты указал, например тебе нужен адрес ячейки eax+ecx*8+8, используеш собственно команду lea ebx, [eax+ecx*8+8]. В ebx окажется адрес, на который указывала [eax+ecx*8+8]. Естественно без нее можно легко обойтись и как такова она не нужна.
LEA ещё используется для оптимизации умножения. Например, такое выражение: Код (Text): EAX = ECX*5 можно записать как: Код (Text): LEA EAX, [ECX+ECX*4] Это гораздо быстрее чем инструкция MUL/IMUL или несколько инструкций сдвигов и сложений.
burkav - а почему не возникоает вопрос зачем нужна команда sub? Вместо Код (Text): sub eax,ebx вполне можно писать Код (Text): neg ebx add eax,ebx Одна команда в большинстве случаев выполняется быстрее, чем последовательность команд.
Что касается прямых адресов, то lea offset xxx и mov offset xxx, то тут ТС прав - команды эквиваленты (ну может за исключением скорости работы - тут не знаю). А по поводу остальных случаев - уже написали, в чем разница
Девайс, который её выполняет, называется сумматор. Из названия видно, он умеет не так то много - так что выполняться к конечном итоге будет именно суммирование. Использование lea перекладывает работу с ALU на MMU. По i686 включительно это считалось весьма эффективным.
Устройство управления памятью (MMU) никакого отношения к вычислению эффективного адреса не имеет, оно выполняет совершенно другие функции. А входными данными для MMU как раз являются эффективные адреса (смещения логических адресов в терминологии Интел) и селекторы сегментов.
Ustus В машине Поста ещё круче -- там вообще одна команда. Если память не изменяет -- декремент и переход, если нуль. Такой вот математический изврат