Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 12
1

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

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

её начало я получаю с помощью ассемблера(offset), не получается получить её конец и вычислить её длину
P. S. Borland c++ 6
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2012, 15:27
Ответы с готовыми решениями:

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

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

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

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

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

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

Добавлено через 52 секунды
неужели некто не знает?
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.04.2012, 15:59 4
Легально (т.е. средствами, гарантированными Стандартом языка, а значит, работающими всегда и на всех мыслимых платформах) - никак.
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,234
06.04.2012, 16:52 5
А если говорить о нелегальных способах, то можно так(тестировалось на 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
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 12
06.04.2012, 20:34  [ТС] 6
а при помощи ассемблерных команд можно?
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,234
06.04.2012, 20:39 7
Цитата Сообщение от Van111 Посмотреть сообщение
а при помощи ассемблерных команд можно?
а код выше разве без участия ассемблера?
идея в том, чтобы создать переменную и положить в неё размер функции, который вычисляется
как разница между началом и концом, это я и привёл в примере.
1
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 12
06.04.2012, 21:57  [ТС] 8
nxnx, если не трудно можешь пожалуйста на интеловский ассемблер перевести
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.04.2012, 22:43 9
А зачем оно вообще нужно?
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
06.04.2012, 22:54 10
полагаю, нужно в коде функции искать опкод инструкции ret.
1
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,234
07.04.2012, 06:45 11
Цитата Сообщение от 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
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 12
07.04.2012, 14:23  [ТС] 12
а кто знает дериктивы которые бы размещали функции в том порядке в котором они встречаются в коде, и точно в том же порядке размещали данные в сегменте данных.

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

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

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


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

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

Код
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)
Код
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
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.04.2012, 20:30 14
Цитата Сообщение от nxnx Посмотреть сообщение
ассемблерный код он не переиначит...
и то, только в том случае, если он помечен как volatile
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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;...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.