powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение адреса overload метода
24 сообщений из 49, страница 2 из 2
Получение адреса overload метода
    #39537151
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДТС желает адрес, в один прием. :)
Переменная и будет содержать адрес. А про "в один приём" речи небыло.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537152
Не в одну строку. .... хоть как-нибудь. Пока более менее нормально можно получить адрес как указано тут . Только ссылка в call (на TStringStream.Create('');) не абсолютная, а относительная.

Представить TStringStream.Create('') в виде
Код: pascal
1.
2.
var
  proc: procedure(a:string);


не получилось, может мозгов не хватает.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537154
Вот так получает адрес:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function GetAddr: Pointer;
label
  L_Exit;
begin
  asm
               mov     eax, @AddrCall.Pointer     // адрес команды
               mov     ebx, eax
               sub     eax, 4                     // адрес смещения функции УТОЧНИТЬ В ОТЛАДЧИКЕ (ОКНО ASSWMBLER)
               mov     eax, [eax]                 // адрес конструктора
               add     ebx, eax
               jmp     L_Exit                     // выход
  @AddrCall:
               dd      L_Exit
  end;
  TStringStream.Create('');
L_Exit:
end;
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537155
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже в темеПредставить TStringStream.Create('') в виде
Адрес конструктора таким cпособом получить нельзя. А нужем именно адрес конструктора? Нельзя классовой ссылкой обойтись?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537156
Kazantsev Alexey,
С классовой ссылкой нужно делать обработку. Вызов непосредственно по адресу работает быстрее.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537158
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже в темеВызов непосредственно по адресу работает быстрее.
Что, настолько быстрее, что на фоне работы ММ заметно?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537174
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на целых несколько инструкций быстрее - выгода просто колоссальная!

Оптимизации уровня Няшика - неделями ускоряем одно место, имея пару десятков реальных узких мест.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537194
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже в теме,
Код: pascal
1.
               add     ebx, eax


Результат будет в EBX, а результат функции возвращается через EAX
EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте"
Теоретически можно воспользоваться другим регистром общего назначения, но не готов сказать, какие и как используются при разных флагах оптимизации. Лучше воспользоваться конструкцией:
Код: pascal
1.
2.
3.
4.
              push    ecx
              mov     ecx, @AddrCall.Pointer
              add     eax, ecx
              pop     ecx
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537204
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И всё-таки, кто-нибудь из гениев ассемблеро-строения объяснит, почему нельзя просто воспользоваться типизированной переменной?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537259
Vizit0rна целых несколько инструкций быстрее - выгода просто колоссальная!
Оптимизации уровня Няшика - неделями ускоряем одно место, имея пару десятков реальных узких мест.
Вызов через адрес уже работал для всех нужных мне классов. Так что эти "недели" уже позади. Только для конструкторов с overload были прикручены костыли. Вот и хотелось узнать есть ли варианты получения их адресов.

FreedoomТоже в теме,
Результат будет в EBX, а результат функции возвращается через EAX
Странно, но у меня Result именно в EBX. ( Delphi 2010 )
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537309
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomEBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте"

Если не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537325
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiЕсли не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой.
Как говорит классик: ... и опыт, сын ошибок трудных ... - практика при использовании ассемблерных вставок и функций на Delphi. Последние несколько лет перешёл на Lazarus, и с ориентированием на кроссплатформенность, стараюсь использовать ассемблер в крайних случаях. Возможно, после Borland, в Delphi немного поменялись соглашения об использовании регистров. Не отслеживал изменения, но думаю, что кардинально ни чего не изменилось.

Тоже в темеСтранно, но у меня Result именно в EBX. ( Delphi 2010 )
У меня нет возможности посмотреть ассемблерный код, генерируемый компиляторм. Глянь в отладчике код функции
Код: pascal
1.
2.
3.
4.
function Test: integer;
begin
  Result := $45
end;
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537334
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jmp_original, попробуй описать типизированную переменную для конструкторов класса TStringBuilder
Код: pascal
1.
2.
3.
4.
5.
6.
constructor Create; overload;
constructor Create(aCapacity: Integer); overload;
constructor Create(const Value: string); overload;
constructor Create(aCapacity: Integer; aMaxCapacity: Integer); overload;
constructor Create(const Value: string; aCapacity: Integer); overload;
constructor Create(const Value: string; StartIndex: Integer; Length: Integer; aCapacity: Integer); overload;
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537387
FreedoomУ меня нет возможности посмотреть ассемблерный код, генерируемый компиляторм. Глянь в отладчике код функции
Код: pascal
1.
2.
3.
4.
function Test: integer;
begin
  Result := $45
end;


Для этой функции Result в EAX. А для той, что описана выше Делфи в конце подставляет:
Код: pascal
1.
2.
3.
mov eax, ebx
pop ebx
ret


Пардон я не правильно написал, Result конечно же в EAX.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537456
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А через RTTI разве нельзя получить описание параметров метода?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537477
Cobalt747,
Попробовал через RTTI.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  aRttiContext:=TRttiContext.Create;
  try
    aRttiType := aRttiContext.GetType(aClass);
    for aRttiMethod in aRttiType.GetDeclaredMethods do
      begin
        aCodeAddress := aRttiMethod.CodeAddress;
        aMethodStr := aRttiMethod.ToString;
      end;
  ....      


Странно, но сейчас получает корректно. Пробовал раньше, но не работало как нужно. Тогда извиняюсь, что дурил все голову.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537635
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomschiЕсли не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой.
Как говорит классик: ... и опыт, сын ошибок трудных ... - практика при использовании ассемблерных вставок и функций на Delphi.

Врет классик. При передаче в методы классов, Self передается в eax (если используется register calling conventions), внутри метода Self может присваиваться локальной переменной (ebp-xx, esp+xx) или любому, в зависимости от random-а, регистру - esi, edi, ebx.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537643
Конструкторы в делфи используют доп. параметр, который передается в регистре DL. Потому верная передача параметров в конструктор не тривиальная задача. Это не простые методы класса.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537665
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiВрет классик. При передаче в методы классов, Self передается в eax
Классик он на то и классик, что не врёт
Фразой "EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте" хотел описать ситуацию, показанную на рисунке
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537675
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме, вот тут как раз в интерпретаторе и используется RTTI

https://github.com/nakijun/dwscript/blob/e6b21982a1f6e0c3befb6753625ed4332430d6cd/Source/dwsRTTIExposer.pas#L17
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537684
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoom,

это если ты паскалевский код с ассемблерным мешаешь внутри функции. ТАм ко всем регистрам лучше осторожно относиться.

но к чисто-паскалевским и чисто-ассемблерным функциям это не относится.

там автоматического mov EBX, EAX быть не должно

....кстати, интересно, почему там MOV а не XCHG
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537719
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomschiВрет классик. При передаче в методы классов, Self передается в eax
Классик он на то и классик, что не врёт
Фразой "EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте" хотел описать ситуацию, показанную на рисунке

Я хотел сказать, что не только к ebx надо относиться осторожно, но и к esi,edi и т.п.

"EBX must not be altered (unless you restore it before the end of the procedure/function), and so must not ESP, EBP, ESI, or EDI either."
https://stackoverflow.com/questions/3557500/what-cpu-registers-are-to-be-restored-at-the-end-of-an-asm-procedure-in-delphi
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537720
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39538133
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_originalИ всё-таки, кто-нибудь из гениев ассемблеро-строения объяснит, почему нельзя просто воспользоваться типизированной переменной?
на XE2 уже не работает :-(

рабочие были вот такие варианты:
если фунция в bpl можно реальное имя посмотреть и через GetProcAddress

в хелпере метод с вменяемым названием и вызовом исходного сделать
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение адреса overload метода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]