Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22

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

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

Студворк — интернет-сервис помощи студентам

Как видно на листинге выше(это игра DAVE MIRRA FREESTYLE BMX, которую я все пытаюсь перелопатить и внести изменения, касательно графики), используется некая таблица перехода, непонятно, зачем функцию вызывать через джампы, это таблица на 700 с копейками функций. Может кто поделиться своими мыслями, чем хороша такая практика компилятора?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2018, 20:03
Ответы с готовыми решениями:

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

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

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

19
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
24.01.2018, 09:47
Так часто преобразуется конструкция switch из с/c++
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
24.01.2018, 15:04
Хорошо бы посмотреть, что было перед этой строкой...
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
24.01.2018, 16:14
Цитата Сообщение от Князь Посмотреть сообщение
непонятно, зачем функцию вызывать через джампы,
это таблица на 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
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
24.01.2018, 16:27
Цитата Сообщение от R71MT Посмотреть сообщение
call [esi]
Это было бы логично, только здесь тогда скорее что-то вроде call esi... иначе зачем там столько jmp?
И зачем реализовывать это всё через jmp, когда можно просто таблицу адресов сделать? Чтобы relocations не настраивать для каждой функции?
0
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
25.01.2018, 07:46
Цитата Сообщение от alexcoder Посмотреть сообщение
Так часто преобразуется конструкция switch из с/c++
вообще то это результат инкрементальной линковки.
используется обычно в дебаг билдах - сборка быстрее + доступна фича "изменить и продолжить".
0
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
25.01.2018, 15:08  [ТС]
В том то и дело, что вызовы не косвенные, call идет по константному адресу обычно, эта таблица начинается с самого начала секции кода за исключением первых пяти байт, в которых стоит int3. Типа один раз составили таблицу и при перекомпиляции только меняем адрес в жампе? Обычно так вызываются импортируемые функции, насколько я заметил. А эти лампы внутрь той же секции
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
26.01.2018, 14:12
Князь, что было до этой строки?
Какой код привёл к ней?
0
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 22
26.01.2018, 18:56  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Хорошо бы посмотреть, что было перед этой строкой...
Перед всеми этими джампами начало бинарника) в коде есть call по адресу джампа.

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

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

Добавлено через 7 минут
Цитата Сообщение от Jin X Посмотреть сообщение
обычно это касается функций DLL
Я пытался скачать, чтобы посмотреть код, но увы не смогла.
0
Заблокирован
30.01.2018, 14:59
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
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
30.01.2018, 18:16
Uncle Remus, И часто Вы без invoke вручную стек формируете?
0
Заблокирован
31.01.2018, 00:36
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  [ТС]
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Вы заметили разницу между CALL <JMP ...> и CALL DWORD PTR[...], Оля, сама показывает, что вызывается.

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

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

Добавлено через 55 секунд
А где можно узнать об _imp__.*?
0
Заблокирован
01.02.2018, 02:39
Цитата Сообщение от Князь Посмотреть сообщение
А где можно узнать об _imp__.*?
Князь,
откройте при помощи hiew32.exe файл "masm32\lib\user32.lib" и попробуйте найти в этом файле функцию MessageBox
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2018, 02:39
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru