Конференция "Начинающим" » Как получить адрес переменной из процедуры на ассемблере?
 
  • dmk © (19.10.17 01:10) [0]
    Есть процедура:


    procedure A;
    var
     B: dword;

     procedure DoSomethingWithB;
     asm
       lea rax,[B] //<- Здесь ерунда получается
     end;

    begin
     DoSomethingWithB;
    end;



    Как получить адрес переменной в такой конструкции? lea грузит не тот адрес.
  • kilkennycat © (19.10.17 02:12) [1]
    rax не dword
  • dmk © (19.10.17 02:41) [2]
    Так мне адрес :)
  • KilkennyCat © (19.10.17 08:02) [3]
    а. тогда без скобок.
  • dmk © (19.10.17 13:58) [4]
    Без скобок тоже ерунду выдает.
    Выдает lea rax, [rsp - $0C],
    а в основном теле процедуры A адрес B получается так lea rdx, [rbp + $000000fc]

    В итоге адрес переменной правильный: $14C8C4, а то что он выдает в процедуре: $14C6A4
    Тут видимо надо знать где компилятор адреса хранит :(
  • Игорь Шевченко © (19.10.17 14:34) [5]

    > Без скобок тоже ерунду выдает.
    > Выдает lea rax, [rsp - $0C],


    адреса локальных переменных внешней процедуры вычисляются через специальный аргумент, передаваемый во вложенную процедуру. Рекомендую написать код вложенной процедуры на паскале и посмотреть сгенерированный машинный код.
  • dmk © (19.10.17 20:15) [6]
    Там жесть какая то. Проще параметром передать через @.
    Получение переменной из вложенной процедуры:

    P := @A;
    000000000074E7CC 488B4520         mov rax,[rbp+$20]
    000000000074E7D0 488D842804020000 lea rax,[rax+rbp+$0204]
    000000000074E7D8 488BCD           mov rcx,rbp
    000000000074E7DB 48F7D9           neg rcx
    000000000074E7DE 488D0408         lea rax,[rax+rcx]
    000000000074E7E2 48894508         mov [rbp+$08],rax


    Глобальные грузятся без проблем, а с локальными заморочки какие-то.
  • Inovet © (20.10.17 04:52) [7]
    > [6] dmk ©   (19.10.17 20:15)

    Так глобальные они по фиксированному адресу, а локальные на стеке и их может быть несколько экземпляров, на сколько стека хватит, поэтому и обращение очевидно разное должно быть.
  • Игорь Шевченко © (20.10.17 10:31) [8]
    Inovet ©   (20.10.17 04:52) [7]

    С локальными проблем еще меньше, но если ты внимательно прочитаешь вопрос, то поймешь, что это не те локальные переменные, которых может быть несколько экземпляров и что экземпляры тут не причем.

    Пора закрывать сайт.
  • dmk © (21.10.17 12:48) [9]
    >Пора закрывать сайт.
    Чего так сразу? На хостинг подкинем. Другой вопрос если надоело.
 
Конференция "Начинающим" » Как получить адрес переменной из процедуры на ассемблере?
Есть новые Нет новых   [118639   +35][b:0][p:0.001]