0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
1

Интересный подход к вызову функций

22.01.2018, 20:03. Показов 859. Ответов 19

Author24 — интернет-сервис помощи студентам
Интересный подход к вызову функций

Как видно на листинге выше(это игра DAVE MIRRA FREESTYLE BMX, которую я все пытаюсь перелопатить и внести изменения, касательно графики), используется некая таблица перехода, непонятно, зачем функцию вызывать через джампы, это таблица на 700 с копейками функций. Может кто поделиться своими мыслями, чем хороша такая практика компилятора?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2018, 20:03
Ответы с готовыми решениями:

Локализация формы по вызову
Приветствую, подскажите пример локализации интерфейса по кнопке менять с дефолтного на английский и...

По вызову socket_close падает сервер
Почему по вызову метода socket_close(по событию отправленным клиентом) закрывается не клиент, а...

Как подойти к вызову одной программы в другой?
Следуюшая задача: Имеется готовая программа, написанная на C++ уже достаточно давно и хорошо...

Область данных, переданная системному вызову, слишком мала
Здравствуйте, при запуске приложений магазина Windows у меня начала возникать ошибка "Область...

19
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,925
24.01.2018, 09:47 2
Так часто преобразуется конструкция switch из с/c++
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,121
Записей в блоге: 12
24.01.2018, 15:04 3
Хорошо бы посмотреть, что было перед этой строкой...
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
24.01.2018, 16:14 4
Цитата Сообщение от Князь Посмотреть сообщение
непонятно, зачем функцию вызывать через джампы,
это таблица на 700 с копейками функций
..сам-же говоришь "на 700 функций",
тогда как иначе вызывать эти функции, через cmp-->je что-ли???
а тут (в зависимости от входных данных) сразу идёт переход, и не надо никаких сравнений.
гипотетически, на асме это выглядит так (условие принимает EAX):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; fasm-code
;твой вариант с одним переходом
;---------------------------------
;[.....]
table   dd  @1, @2,....,@700    ; дамп Оли выше 
 
shl     eax,2
mov     esi,table
add     esi,eax
call    [esi]
 
@1:   retf     ; функции
;....          ; ^^^^
@700: retf     ; ^^^^
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,121
Записей в блоге: 12
24.01.2018, 16:27 5
Цитата Сообщение от R71MT Посмотреть сообщение
call [esi]
Это было бы логично, только здесь тогда скорее что-то вроде call esi... иначе зачем там столько jmp?
И зачем реализовывать это всё через jmp, когда можно просто таблицу адресов сделать? Чтобы relocations не настраивать для каждой функции?
0
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
25.01.2018, 07:46 6
Цитата Сообщение от alexcoder Посмотреть сообщение
Так часто преобразуется конструкция switch из с/c++
вообще то это результат инкрементальной линковки.
используется обычно в дебаг билдах - сборка быстрее + доступна фича "изменить и продолжить".
0
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
25.01.2018, 15:08  [ТС] 7
В том то и дело, что вызовы не косвенные, call идет по константному адресу обычно, эта таблица начинается с самого начала секции кода за исключением первых пяти байт, в которых стоит int3. Типа один раз составили таблицу и при перекомпиляции только меняем адрес в жампе? Обычно так вызываются импортируемые функции, насколько я заметил. А эти лампы внутрь той же секции
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,121
Записей в блоге: 12
26.01.2018, 14:12 8
Князь, что было до этой строки?
Какой код привёл к ней?
0
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
26.01.2018, 18:56  [ТС] 9
Цитата Сообщение от Jin X Посмотреть сообщение
Хорошо бы посмотреть, что было перед этой строкой...
Перед всеми этими джампами начало бинарника) в коде есть call по адресу джампа.

Добавлено через 42 минуты
Цитата Сообщение от jr_ Посмотреть сообщение
вообще то это результат инкрементальной линковки.
используется обычно в дебаг билдах - сборка быстрее + доступна фича "изменить и продолжить".
Можно поподробнее про эту линковку, о таком параметре компилятора знаю, но не совсем понимаю суть, инкремент - увеличивать, что эта линковку увеличивает?)
0
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
26.01.2018, 19:00 10
Князь, я не знаю всех подробностей как это работает, инфы не очень много.
знаю только что написал выше - ускорение сборки + возможность вносить изменения в код во без необходимости пересборки+перезапуска.
0
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
26.01.2018, 19:18  [ТС] 11
Цитата Сообщение от jr_ Посмотреть сообщение
Князь, я не знаю всех подробностей как это работает, инфы не очень много.
знаю только что написал выше - ускорение сборки + возможность вносить изменения в код во без необходимости пересборки+перезапуска.
Похоже на правду, по идее если дописывать код функции, он сдвинет все другие и придется везде править во всех колах адреса. А так только поправить смещение на джампе. Из раздела "магические константы это плохо".
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
29.01.2018, 11:38 12
Ребята, это все проделки компилятора.
Смотрите сами. Один FASM переходит по адресу в памяти, остальные(Masm, Tasm, Delphi, C - не проверял) через джамп.
Миниатюры
Интересный подход к вызову функций   Интересный подход к вызову функций   Интересный подход к вызову функций  

Интересный подход к вызову функций  
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,121
Записей в блоге: 12
29.01.2018, 18:27 13
Constantin Cat, обычно это касается функций DLL.
А тут на DLL как-то не похоже (судя по адресам).
0
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
30.01.2018, 09:26 14
Constantin Cat, где же на скринах джампы ?
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
30.01.2018, 14:25 15
Цитата Сообщение от jr_ Посмотреть сообщение
где же на скринах джампы
Вы заметили разницу между CALL <JMP ...> и CALL DWORD PTR[...], Оля, сама показывает, что вызывается.

Добавлено через 7 минут
Цитата Сообщение от Jin X Посмотреть сообщение
обычно это касается функций DLL
Я пытался скачать, чтобы посмотреть код, но увы не смогла.
0
Заблокирован
30.01.2018, 14:59 16
Constantin Cat,
для masm CALL <JMP ...>появится, если
Assembler
1
2
3
4
include kernel32.inc
includelib kernel32.lib
...
invoke ExitProcess,0
CALL DWORD PTR[...] появится при
Assembler
1
2
3
4
5
includelib kernel32.lib
extern _imp__ExitProcess@4:dword
...
push 0
call _imp__ExitProcess@4
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
30.01.2018, 18:16 17
Uncle Remus, И часто Вы без invoke вручную стек формируете?
0
Заблокирован
31.01.2018, 00:36 18
Constantin Cat,
я стараюсь обходиться без invoke, но речь ведь шла не об этом. В #16 была иллюстрация того, как заставить link.exe формировать CALL <JMP _imp__ExitProcess@4>/JMP _imp__ExitProcess@4 или непосредственно CALL DWORD PTR _imp__ExitProcess@4
0
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
31.01.2018, 18:43  [ТС] 19
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Вы заметили разницу между CALL <JMP ...> и CALL DWORD PTR[...], Оля, сама показывает, что вызывается.

Добавлено через 7 минут

Я пытался скачать, чтобы посмотреть код, но увы не смогла.
Это было мне адресовано? Вам ссылку скинуть?

Добавлено через 55 секунд
А где можно узнать об _imp__.*?
0
Заблокирован
01.02.2018, 02:39 20
Цитата Сообщение от Князь Посмотреть сообщение
А где можно узнать об _imp__.*?
Князь,
откройте при помощи hiew32.exe файл "masm32\lib\user32.lib" и попробуйте найти в этом файле функцию MessageBox
0
01.02.2018, 02:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2018, 02:39
Помогаю со студенческими работами здесь

Нужны два примера по вызову параметров по значению и по ссылке
Здравствуйте! Помогите мне пожалуйста! Препод задала задание, которое мы не проходили... я весь...

Область данных переданная по системному вызову слишком мала
Выполняется запрос к серверу, используется компонент THTTPRIO. На этапе получения ответа некоторых...

Недопустимая операция: приводит к повторному вызову функции SetCurrentCellAddressCore
Есть dataGrid в него включено событие CellEnter. В обработчике данного события по некоторому...

как "мастера по вызову" устанавливают антивирус ?
как &quot;мастера по вызову&quot; устанавливают антивирус, ведь чтобы был лицензионный антивирус, нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru