-
Есть процедура:
procedure A;
var
B: dword;
procedure DoSomethingWithB;
asm
lea rax,[B] end;
begin
DoSomethingWithB;
end; Как получить адрес переменной в такой конструкции? lea грузит не тот адрес.
-
rax не dword
-
Так мне адрес :)
-
а. тогда без скобок.
-
Без скобок тоже ерунду выдает. Выдает lea rax, [rsp - $0C] , а в основном теле процедуры A адрес B получается так lea rdx, [rbp + $000000fc]
В итоге адрес переменной правильный: $14C8C4 , а то что он выдает в процедуре: $14C6A4 Тут видимо надо знать где компилятор адреса хранит :(
-
> Без скобок тоже ерунду выдает. > Выдает lea rax, [rsp - $0C],
адреса локальных переменных внешней процедуры вычисляются через специальный аргумент, передаваемый во вложенную процедуру. Рекомендую написать код вложенной процедуры на паскале и посмотреть сгенерированный машинный код.
-
Там жесть какая то. Проще параметром передать через @. Получение переменной из вложенной процедуры:
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
Глобальные грузятся без проблем, а с локальными заморочки какие-то.
-
> [6] dmk © (19.10.17 20:15)
Так глобальные они по фиксированному адресу, а локальные на стеке и их может быть несколько экземпляров, на сколько стека хватит, поэтому и обращение очевидно разное должно быть.
-
Inovet © (20.10.17 04:52) [7]
С локальными проблем еще меньше, но если ты внимательно прочитаешь вопрос, то поймешь, что это не те локальные переменные, которых может быть несколько экземпляров и что экземпляры тут не причем.
Пора закрывать сайт.
-
>Пора закрывать сайт. Чего так сразу? На хостинг подкинем. Другой вопрос если надоело.
|