lea

Тема в разделе "WASM.ASSEMBLER", создана пользователем emo, 14 окт 2005.

  1. emo

    emo New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    14
    Адрес:
    Armenia
    Скажите, пожалуйста... как это происходить

    mov bx,2

    lea bx,[ebx+ebx*2] ;<=>bx=6
     
  2. tim

    tim New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2003
    Сообщения:
    8
    В bx изначально 2. Инструкция lea кладёт адрес правого операнда в левый. Получается bx = 2 + 2*2 = 6.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    bx = ebx+ebx*2

    если ebx=2, то ebx+ebx*2=6

    bх - это младшие 16 бит регистра ebx, поэтому по идее перед mov bx,2 должен стоять xor ebx,ebx чтобы обнулить старшую часть ebx - иначе там может быть какой-то мусор и результат м.б. не равен 6
     
  4. emo

    emo New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    14
    Адрес:
    Armenia
    Инструкция lea кладёт адрес правого операнда в левый

    но что значит адрес [ebx+ebx*2]
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    е можно убрать(мысленно) чтоб не мешал, тогда будет понятно



    lea bx,[bx+bx*2]







    Какой нафиг адрес, bx*3 и все
     
  6. emo

    emo New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    14
    Адрес:
    Armenia
    е можно убрать

    Error -> Illegal indexing mode
     
  7. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87


    _мысленно_ ;)
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    emo

    > "Инструкция lea кладёт адрес правого операнда в левый"

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

    MCL New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    21
    По-другому: lea bx, [xx] - кладет в bx адрес байта, который находится по адресу xx.
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Тоже, что и mov bx,[xx] ... Я до сих пор не понимаю этого дублирования, или в реальном режиме есть какие-то различия?
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    MCL

    > "адрес байта, который находится по адресу"

    во-первых,в народе про такое говорят - масло масляное ;))

    во-вторых, вычисленный адрес м.б. инвалидным и никакого байта по этому адресу может и не быть ;)

    bogrus

    > "Тоже, что и mov bx,[xx]..."

    ... Ты че - прикалываешься =)

    emo не слушай, ты нас умников - мы тут видать пивка все махнули с устатку в конце трудовой недели

    Получилось у тебя 2+2*2=6 и слава богу, если сомневаешься - проверь на калькуляторе ;) А не то счаз в такие дебри залезем...
     
  12. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    leo блин, переклинило :) ну что lea bx,[0xffff] и mov bx,0xffff тоже самое но кодируется по другому, короче lea c памятью не работает, хотя reg,mem стоит в opcodes.hlp
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Короче так. Инструкция процессора LEA просто вычисляет выражения типа BaseReg+IndexReg*Scale+Disp, где BaseReg и IndexReg регистровые операнды, Scale=0,1,2,4,8 и Disp - числовая константа (8 или 16\32 бит). И по сути пофиг какие операнды мы подставляем в LEA - это может быть как вычисление адреса, так и просто сложения\умножения любых чисел.

    А название инструкции Load-Effective-Address и мнемоника описания опкода LEA r32,m просто связаны с тем, что допустимые выражения в операнде источнике соответствуют способам адресации памяти и на языке асма заключаются в квадратные скобки. Ec-но инструкция MOV reg,[mem] это совсем другое, т.к. LEA просто вычисляет адрес, заданный выражением mem, и сохраняет его в reg, а MOV загружает в reg данные из памяти, которые лежат по адресу mem. Разумеется если адрес mem инвалидный, то MOV выдаст исключение, а для LEA ес-но пофиг чего там получится в результате.



    Ну а с адресами в LEA мы имеем дело не на уровне процессора (которому все равно что мы вычисляем), а на уровне соглашений ассемблера. Наприммер, при buf dq 0 команда ассемблера lea eax,[buf+4] загрузит в eax адрес старшего дворда переменной buf (хотя для процессора это просто загрузка константы Disp32, которую асм любезно вычислит и подставит в машинный код за нас ;)
     
  14. emo

    emo New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    14
    Адрес:
    Armenia
    спасибо что обсудили...
     
  15. MCL

    MCL New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    21
    >> "адрес байта, который находится по адресу"

    >во-первых,в народе про такое говорят - масло масляное ;))

    Масло то масляное, но кашу маслом не испортишь :)

    Лично мне данное обьяснение понятней. То есть: говорю, как понимаю.



    >во-вторых, вычисленный адрес м.б. инвалидным и никакого >байта по этому адресу может и не быть ;)

    Ну даже может и не быть, и что? Это никак не мешает нам узнать адрес.
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo



    Нет, не может. Обратите внимание на то, что первым операндом LEA стоит BX, а не EBX.
     
  17. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    MCL прав. Наверное просто путаницу вводит наличие скобок - в lea они могут и не ставиться (что lea edx, String, что

    lea edx, [String] будут работать одинаково(по крайней мере в masm32)).
     
  18. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Только нужно отметить, что команда lea, к скобкам в MASM'e отношения не имеет.

    Там со всеми командами так же будет. И cmp и даже mov, это ж MS.