|
|
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
чччДТС желает адрес, в один прием. :) Переменная и будет содержать адрес. А про "в один приём" речи небыло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 01:05:55 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Не в одну строку. .... хоть как-нибудь. Пока более менее нормально можно получить адрес как указано тут . Только ссылка в call (на TStringStream.Create('');) не абсолютная, а относительная. Представить TStringStream.Create('') в виде Код: pascal 1. 2. не получилось, может мозгов не хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 01:22:06 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Вот так получает адрес: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 01:48:58 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Тоже в темеПредставить TStringStream.Create('') в виде Адрес конструктора таким cпособом получить нельзя. А нужем именно адрес конструктора? Нельзя классовой ссылкой обойтись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 01:52:29 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, С классовой ссылкой нужно делать обработку. Вызов непосредственно по адресу работает быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 02:09:32 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Тоже в темеВызов непосредственно по адресу работает быстрее. Что, настолько быстрее, что на фоне работы ММ заметно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 02:22:17 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
на целых несколько инструкций быстрее - выгода просто колоссальная! Оптимизации уровня Няшика - неделями ускоряем одно место, имея пару десятков реальных узких мест. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 07:22:43 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Тоже в теме, Код: pascal 1. Результат будет в EBX, а результат функции возвращается через EAX EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте" Теоретически можно воспользоваться другим регистром общего назначения, но не готов сказать, какие и как используются при разных флагах оптимизации. Лучше воспользоваться конструкцией: Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 08:36:41 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
И всё-таки, кто-нибудь из гениев ассемблеро-строения объяснит, почему нельзя просто воспользоваться типизированной переменной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 08:59:14 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Vizit0rна целых несколько инструкций быстрее - выгода просто колоссальная! Оптимизации уровня Няшика - неделями ускоряем одно место, имея пару десятков реальных узких мест. Вызов через адрес уже работал для всех нужных мне классов. Так что эти "недели" уже позади. Только для конструкторов с overload были прикручены костыли. Вот и хотелось узнать есть ли варианты получения их адресов. FreedoomТоже в теме, Результат будет в EBX, а результат функции возвращается через EAX Странно, но у меня Result именно в EBX. ( Delphi 2010 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 09:51:44 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
FreedoomEBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте" Если не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:34:31 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
schiЕсли не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой. Как говорит классик: ... и опыт, сын ошибок трудных ... - практика при использовании ассемблерных вставок и функций на Delphi. Последние несколько лет перешёл на Lazarus, и с ориентированием на кроссплатформенность, стараюсь использовать ассемблер в крайних случаях. Возможно, после Borland, в Delphi немного поменялись соглашения об использовании регистров. Не отслеживал изменения, но думаю, что кардинально ни чего не изменилось. Тоже в темеСтранно, но у меня Result именно в EBX. ( Delphi 2010 ) У меня нет возможности посмотреть ассемблерный код, генерируемый компиляторм. Глянь в отладчике код функции Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:49:01 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
jmp_original, попробуй описать типизированную переменную для конструкторов класса TStringBuilder Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 10:58:22 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
FreedoomУ меня нет возможности посмотреть ассемблерный код, генерируемый компиляторм. Глянь в отладчике код функции Код: pascal 1. 2. 3. 4. Для этой функции Result в EAX. А для той, что описана выше Делфи в конце подставляет: Код: pascal 1. 2. 3. Пардон я не правильно написал, Result конечно же в EAX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 11:44:13 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
А через RTTI разве нельзя получить описание параметров метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 13:03:41 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Cobalt747, Попробовал через RTTI. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Странно, но сейчас получает корректно. Пробовал раньше, но не работало как нужно. Тогда извиняюсь, что дурил все голову. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 13:41:01 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
FreedoomschiЕсли не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой. Как говорит классик: ... и опыт, сын ошибок трудных ... - практика при использовании ассемблерных вставок и функций на Delphi. Врет классик. При передаче в методы классов, Self передается в eax (если используется register calling conventions), внутри метода Self может присваиваться локальной переменной (ebp-xx, esp+xx) или любому, в зависимости от random-а, регистру - esi, edi, ebx. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 17:06:42 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Конструкторы в делфи используют доп. параметр, который передается в регистре DL. Потому верная передача параметров в конструктор не тривиальная задача. Это не простые методы класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 17:20:01 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
schiВрет классик. При передаче в методы классов, Self передается в eax Классик он на то и классик, что не врёт Фразой "EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте" хотел описать ситуацию, показанную на рисунке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 18:00:45 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
По теме, вот тут как раз в интерпретаторе и используется RTTI https://github.com/nakijun/dwscript/blob/e6b21982a1f6e0c3befb6753625ed4332430d6cd/Source/dwsRTTIExposer.pas#L17 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 18:21:10 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Freedoom, это если ты паскалевский код с ассемблерным мешаешь внутри функции. ТАм ко всем регистрам лучше осторожно относиться. но к чисто-паскалевским и чисто-ассемблерным функциям это не относится. там автоматического mov EBX, EAX быть не должно ....кстати, интересно, почему там MOV а не XCHG ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 18:34:44 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 21:05:43 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
Ну и собственно тут: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Using_Inline_Assembly_Code ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2017, 21:06:40 |
|
||
|
Получение адреса overload метода
|
|||
|---|---|---|---|
|
#18+
jmp_originalИ всё-таки, кто-нибудь из гениев ассемблеро-строения объяснит, почему нельзя просто воспользоваться типизированной переменной? на XE2 уже не работает :-( рабочие были вот такие варианты: если фунция в bpl можно реальное имя посмотреть и через GetProcAddress в хелпере метод с вменяемым названием и вызовом исходного сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 15:17:05 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39537665&tid=2041706]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
181ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 533ms |

| 0 / 0 |
