- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
void test1(void)
{
printf("test1\n");
}
void test2(void)
{
printf("test2\n");
}
void test3(void)
{
printf("test3\n");
}
void test4(void)
{
printf("test4\n");
}
uint8_t func_dist[3] = {(uint8_t)((char *)test2-(char *)test1), (uint8_t)((char *)test3-(char *)test2), (uint8_t)((char *)test4-(char *)test3)};
void callf(uint8_t fn)
{
size_t sum_dis = 0;
for (uint8_t i = 0; i < fn; i++)
{
sum_dis += func_dist[i];
}
( (void(*)(void)) ((char *)test1+sum_dis) ) ();
}
int main(void)
{
callf(0);
callf(1);
callf(2);
callf(3);
return EXIT_SUCCESS;
}
Зожатие указателей. Главное чтоб длины функций не превышали 255 и чтоб функции шли строго подряд, как они объявлены кода
Как сделать чтобы это компилировалось сишкой?
j123123 10.07.2018 21:14 # 0
guest8 10.07.2018 21:16 # −999
j123123 10.07.2018 21:33 # 0
Sim_salapim 10.07.2018 22:24 # −2
j123123 10.07.2018 22:30 # 0
Sim_salapim 10.07.2018 22:34 # −2
roskomgovno 12.07.2018 04:01 # 0
j123123 12.07.2018 07:19 # 0
666_N33D135 12.07.2018 07:31 # 0
j123123 12.07.2018 07:39 # 0
j123123 12.07.2018 07:29 # 0
не может быть вычислено на этапе компиляции. Компилятор узнает о расстоянии между двумя указателями на фукцнями уже в конце, когда все оттранслировано в машинный код.
Вот типа будет у нас в некоторой функции function3 код:
Если разница между function1 и function2 будет равна 20 то нужно всегда выполнять {делай_некую_фигню;} и проверка условия лишняя, т.к. указатели на функции в процессе выполнения не могут сместиться. Саму проверку if() можно выкинуть
Если разница между function1 и function2 будет не равна 20, никогда ничего выполнять не надо и проверку делать тоже смысла нет.
Но тут интересный момент. Если компилятор сделат те или иные действия (выкинет только if() проверку т.к. решит что там всегда true или выкинет и проверку и код т.к. решит то там всегда false) - это может в итоге повлиять на расстояние между двумя указателями, и получится что эта оптимизация неправильная.
Вот потому-то Настоящие Цари не будут использовать какие-то анскильные плюсы и сишку, а будут писать сразу в машинных кодах или в крайнем случае на ассемблере
bormand 12.07.2018 07:33 # 0
Добавить новый формат релокации -- расстояние между джвумя символами. Ну или возможность инициализации глобалок в рантайме как в крестах.
З.Ы. Дизасм не глядел, так что могу заблуждаться.