0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
|
|
1 | |
Интересный подход к вызову функций22.01.2018, 20:03. Показов 859. Ответов 19
Как видно на листинге выше(это игра DAVE MIRRA FREESTYLE BMX, которую я все пытаюсь перелопатить и внести изменения, касательно графики), используется некая таблица перехода, непонятно, зачем функцию вызывать через джампы, это таблица на 700 с копейками функций. Может кто поделиться своими мыслями, чем хороша такая практика компилятора?
0
|
22.01.2018, 20:03 | |
Ответы с готовыми решениями:
19
Локализация формы по вызову По вызову socket_close падает сервер Как подойти к вызову одной программы в другой? Область данных, переданная системному вызову, слишком мала |
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,925
|
|
24.01.2018, 09:47 | 2 |
Так часто преобразуется конструкция switch из с/c++
0
|
Эксперт Hardware
|
||||||
24.01.2018, 16:14 | 4 | |||||
..сам-же говоришь "на 700 функций",
тогда как иначе вызывать эти функции, через cmp-->je что-ли???а тут (в зависимости от входных данных) сразу идёт переход, и не надо никаких сравнений. гипотетически, на асме это выглядит так (условие принимает EAX):
0
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
24.01.2018, 16:27 | 5 |
Это было бы логично, только здесь тогда скорее что-то вроде
call esi ... иначе зачем там столько jmp?И зачем реализовывать это всё через jmp, когда можно просто таблицу адресов сделать? Чтобы relocations не настраивать для каждой функции?
0
|
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|
25.01.2018, 07:46 | 6 |
вообще то это результат инкрементальной линковки.
используется обычно в дебаг билдах - сборка быстрее + доступна фича "изменить и продолжить".
0
|
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
|
|
25.01.2018, 15:08 [ТС] | 7 |
В том то и дело, что вызовы не косвенные, call идет по константному адресу обычно, эта таблица начинается с самого начала секции кода за исключением первых пяти байт, в которых стоит int3. Типа один раз составили таблицу и при перекомпиляции только меняем адрес в жампе? Обычно так вызываются импортируемые функции, насколько я заметил. А эти лампы внутрь той же секции
0
|
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
|
|
26.01.2018, 18:56 [ТС] | 9 |
Перед всеми этими джампами начало бинарника) в коде есть call по адресу джампа.
Добавлено через 42 минуты Можно поподробнее про эту линковку, о таком параметре компилятора знаю, но не совсем понимаю суть, инкремент - увеличивать, что эта линковку увеличивает?)
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 |
Похоже на правду, по идее если дописывать код функции, он сдвинет все другие и придется везде править во всех колах адреса. А так только поправить смещение на джампе. Из раздела "магические константы это плохо".
0
|
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|
29.01.2018, 11:38 | 12 |
Ребята, это все проделки компилятора.
Смотрите сами. Один FASM переходит по адресу в памяти, остальные(Masm, Tasm, Delphi, C - не проверял) через джамп.
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 |
Вы заметили разницу между CALL <JMP ...> и CALL DWORD PTR[...], Оля, сама показывает, что вызывается.
Добавлено через 7 минут Я пытался скачать, чтобы посмотреть код, но увы не смогла.
0
|
Заблокирован
|
|||||||||||
30.01.2018, 14:59 | 16 | ||||||||||
Constantin Cat,
для masm CALL <JMP ...>появится, если
0
|
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|
30.01.2018, 18:16 | 17 |
Uncle Remus, И часто Вы без invoke вручную стек формируете?
0
|
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
|
|
31.01.2018, 18:43 [ТС] | 19 |
Это было мне адресовано? Вам ссылку скинуть?
Добавлено через 55 секунд А где можно узнать об _imp__.*?
0
|
Заблокирован
|
|
01.02.2018, 02:39 | 20 |
Князь,
откройте при помощи hiew32.exe файл "masm32\lib\user32.lib" и попробуйте найти в этом файле функцию MessageBox
0
|
01.02.2018, 02:39 | |
01.02.2018, 02:39 | |
Помогаю со студенческими работами здесь
20
Нужны два примера по вызову параметров по значению и по ссылке Область данных переданная по системному вызову слишком мала Недопустимая операция: приводит к повторному вызову функции SetCurrentCellAddressCore как "мастера по вызову" устанавливают антивирус ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |