Команда LEA. Не понятен смысл

Тема в разделе "WASM.ASSEMBLER", создана пользователем burkav, 19 июл 2009.

  1. burkav

    burkav New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2009
    Сообщения:
    8
    Новичек в ассемблере. Начинаю потихоньку разбираться. Не могу понять смысл команды "LEA". Почему скажем просто не пересылать адрес переменной в регистр командой MOV ?

    Например: есть локальная переменная которая находится по адресу ebp+8. В коде дизассемблированной С-программы нашел инструкцию

    lea ecx,[ebp+8]

    почему скажем не загрузить в ecx вычисленное выражение "ebp+8" командой mov ?

    Читал Intel Architectures Software Developer's Manual что касается описания этой команды. Понятней не стало.
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Да можно и через mov. Только тогда вместо "lea ecx, [ebp+8]" нужно написать это:
    Код (Text):
    1. mov ecx, ebp
    2. add ecx, 8
    Смысл тот же, но lea короче и понятнее выходит.


    Не путать только с "mov ecx, [ebp+8]" – эквивалентом такой инструкции будет следующее:
    Код (Text):
    1. mov ecx, ebp
    2. add ecx, 8
    3. mov ecx, [ecx]
     
  3. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    LEA переносит вычисленный адрес операции в регистр что ты указал, например тебе нужен адрес ячейки eax+ecx*8+8, используеш собственно команду lea ebx, [eax+ecx*8+8]. В ebx окажется адрес, на который указывала [eax+ecx*8+8]. Естественно без нее можно легко обойтись и как такова она не нужна.
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    LEA ещё используется для оптимизации умножения. Например, такое выражение:
    Код (Text):
    1. EAX = ECX*5
    можно записать как:
    Код (Text):
    1. LEA EAX, [ECX+ECX*4]
    Это гораздо быстрее чем инструкция MUL/IMUL или несколько инструкций сдвигов и сложений.
     
  5. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    я бы на 5 умножил как mov eax,ecx; shl eax,2; add eax,ecx, битовые операции самые быстрые вроде как.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    sib быстрее
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    burkav - а почему не возникоает вопрос зачем нужна команда sub?
    Вместо
    Код (Text):
    1. sub eax,ebx
    вполне можно писать
    Код (Text):
    1. neg ebx
    2. add eax,ebx
    Одна команда в большинстве случаев выполняется быстрее, чем последовательность команд.
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Что касается прямых адресов, то lea offset xxx и mov offset xxx, то тут ТС прав - команды эквиваленты (ну может за исключением скорости работы - тут не знаю). А по поводу остальных случаев - уже написали, в чем разница
     
  9. burkav

    burkav New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2009
    Сообщения:
    8
    Все понятно. Спасибо !
     
  10. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Девайс, который её выполняет, называется сумматор. Из названия видно, он умеет не так то много - так что выполняться к конечном итоге будет именно суммирование.

    Использование lea перекладывает работу с ALU на MMU. По i686 включительно это считалось весьма эффективным.
     
  11. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Устройство управления памятью (MMU) никакого отношения к вычислению эффективного адреса не имеет, оно выполняет совершенно другие функции. А входными данными для MMU как раз являются эффективные адреса (смещения логических адресов в терминологии Интел) и селекторы сегментов.
     
  12. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    cppasm
    А на некоторых RISC-ах так и сделано :)
    SII
    Наверное, имелось ввиду AGU. ;)
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Ustus
    В машине Поста ещё круче -- там вообще одна команда. Если память не изменяет -- декремент и переход, если нуль. Такой вот математический изврат :)
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    SII
    Ну, это теория... А в RISC'ах просто экономят команды, чтобы впихнуть все в слово.