Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Как получить адрес переменной из процедуры на ассемблере?


dmk ©   (19.10.17 01:10

Есть процедура:


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]

>Пора закрывать сайт.
Чего так сразу? На хостинг подкинем. Другой вопрос если надоело.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо