Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12

Как получить размер функции?

06.04.2012, 15:27. Показов 5499. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
её начало я получаю с помощью ассемблера(offset), не получается получить её конец и вычислить её длину
P. S. Borland c++ 6
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2012, 15:27
Ответы с готовыми решениями:

Получить массив char и его размер из функции - Указатель не меняется вне функции
Помогите пожалуйста разобраться в чём проблема. Добавлено через 34 минуты Помогите пожалуйста разобраться в чём проблема. Нужно...

Как получить размер блока в файловой системе
Си+ linux. Пытаюсь вывести размер блока файловой системы struct stat buf; i = stat("имя файла", &buf); ...

Как измерить размер функции в байтах?
вот есть функция. сколько байт она занимает?

13
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
06.04.2012, 15:34
Цитата Сообщение от Van111 Посмотреть сообщение
не получается получить её конец и вычислить её длину
Просто из любопытства: а Вам оно за чем?
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
06.04.2012, 15:57  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Просто из любопытства: а Вам оно за чем?
WriteProcessMemory

Добавлено через 20 минут
неужели некто не знает?

Добавлено через 52 секунды
неужели некто не знает?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.04.2012, 15:59
Легально (т.е. средствами, гарантированными Стандартом языка, а значит, работающими всегда и на всех мыслимых платформах) - никак.
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
06.04.2012, 16:52
А если говорить о нелегальных способах, то можно так(тестировалось на 32 битных осях, винда и линукс, компилятор mingw/gcc соответственно):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
extern const long test_size;
 
#ifdef __cplusplus
extern "C" {
    static void test_func(void);
}
#endif
asm("L_B1:");
static void test_func(void)
{
    asm volatile("nop");
}
#ifdef WIN32
asm("_test_size: .long .-L_B1");
#else
asm("test_size: .long .-L_B1");
#endif
 
int main(void)
{
    
    test_func();
    printf("Start_adress: %p, size: %ld\n",test_func,test_size);
    return 0;
}
http://liveworkspace.org/code/... 0995b55d53

Добавлено через 8 минут
з.ы. предлагаю модераторам перенести эту тему сюда https://www.cyberforum.ru/cpp/
имхо, вопрос не попадает в категорию "для новичков"
2
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
06.04.2012, 20:34  [ТС]
а при помощи ассемблерных команд можно?
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
06.04.2012, 20:39
Цитата Сообщение от Van111 Посмотреть сообщение
а при помощи ассемблерных команд можно?
а код выше разве без участия ассемблера?
идея в том, чтобы создать переменную и положить в неё размер функции, который вычисляется
как разница между началом и концом, это я и привёл в примере.
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
06.04.2012, 21:57  [ТС]
nxnx, если не трудно можешь пожалуйста на интеловский ассемблер перевести
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.04.2012, 22:43
А зачем оно вообще нужно?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
06.04.2012, 22:54
полагаю, нужно в коде функции искать опкод инструкции ret.
1
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
07.04.2012, 06:45
Цитата Сообщение от niXman Посмотреть сообщение
олагаю, нужно в коде функции искать опкод инструкции ret.
Если в функции несколько инструкций ret то размер будет неточным

Цитата Сообщение от Van111 Посмотреть сообщение
если не трудно можешь пожалуйста на интеловский ассемблер перевести
как такое сделать для борландовских компиляторов я не знаю. но синтаксис вроде и так почти/интеловский

з.ы. можно ещё попробовать так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void test_func(void)
{
    //asm volatile("nop");
}
void foo(void)
{
   
}
 
 
int main(void)
{
    
    test_func();
    printf("Start_adress: %p, size: %u\n",test_func,(size_t)foo-(size_t)test_func);
    return 0;
}
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
07.04.2012, 14:23  [ТС]
а кто знает дериктивы которые бы размещали функции в том порядке в котором они встречаются в коде, и точно в том же порядке размещали данные в сегменте данных.

Добавлено через 8 минут
объясните странность
void MyMessage()
{
MessageBox(0,"OK","OK",MB_OK );
return;
}
MessageBox весит 5 байт, return 1 получаем 6, всё правильно
но если убрать MessageBox размер равен двум, как так??
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
07.04.2012, 14:41
а кто знает дериктивы которые бы размещали функции в том порядке в котором они встречаются в коде, и точно в том же порядке размещали данные в сегменте данных.
помоему таких директив не существует.
компилятор вправе делать ассемблерный код по своему усмотрению.
Вот ассемблерный код он не переиначит...

объясните странность
Все старнности решаются через дизассемблирование функций. В борланде это помоему сделать проще некуда.

пример(mingw, синтаксис intel):


код 1
C
1
2
3
4
5
void MyMessage()
{
MessageBox(0,"OK","OK",MB_OK );
return;
}

дизазм 1 (размер 47)

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MyMessage()
MyMessage+0: push   ebp
MyMessage+1: mov    ebp,esp
MyMessage+3: sub    esp,0x18
!MessageBox(0,"OK","OK",MB_OK );
MyMessage+6: mov    DWORD PTR [esp+0xc],0x0
MyMessage+14: mov    DWORD PTR [esp+0x8],0x403064
MyMessage+22: mov    DWORD PTR [esp+0x4],0x403064
MyMessage+30: mov    DWORD PTR [esp],0x0
MyMessage+37: call   0x401b88 <MessageBoxA@16>
MyMessage+42: sub    esp,0x10
!return;
!}
MyMessage+45: leave  
MyMessage+46: ret


код 2
C
1
2
3
4
5
void MyMessage()
{
//MessageBox(0,"OK","OK",MB_OK );
return;
}

дизазм 2 (размер 5)
Code
1
2
3
4
5
6
7
8
MyMessage()
MyMessage+0: push   ebp
MyMessage+1: mov    ebp,esp
!//MessageBox(0,"OK","OK",MB_OK );
!return;
!}
MyMessage+3: pop    ebp
MyMessage+4: ret
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.04.2012, 20:30
Цитата Сообщение от nxnx Посмотреть сообщение
ассемблерный код он не переиначит...
и то, только в том случае, если он помечен как volatile
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2012, 20:30
Помогаю со студенческими работами здесь

Как получить размер папки
Нужно со считать размер именно директории .Прошу посоветовать в какую сторону глядеть, какую библиотеку или же код использовать ? ...

Как получить размер объекта
Доброго времени суток вопрос: как можно получить размер объекта? к примеру есть 3d-объект - прямоугольник, нужно узнать его длину...

Как получить размер изображения в КБ
&lt;div class=&quot;gallery&quot;&gt;&lt;img src=&quot;Natalia_Semanova.jpg&quot; width=&quot;200&quot; height=&quot;150&quot; onmouseover=&quot; return Showstatus(3);&quot; onmouseout=&quot; status=('...

Как получить размер файла
Я создаю игру с регистрацией и входом в неё. Так вот: Для каждого аккаунта есть отдельный файл на сервере. Когда пользователь входит в...

Как получить размер папки
Как получить размер папки? Мне это нужно для игры, типо анти-чит) После получения размера надо выполнить такое действие: if(sizemods...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru