- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
void trampoline(void (*func)(void), bool flag)
{
if (flag)
func();
else
trampoline(func, true);
}
int
main(int argc, char *argv[])
{
/*... */
trampoline(set_aes_keys, false);
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
void trampoline(void (*func)(void), bool flag)
{
if (flag)
func();
else
trampoline(func, true);
}
int
main(int argc, char *argv[])
{
/*... */
trampoline(set_aes_keys, false);
}
Зачем так? ЯННП.
З.Ы. А у этого трамплина только одна реализация? Или есть какая-то другая под #ifdef'ом?
Остаётся открытым вопрос, для чего нам нужен этот трамплин, почему напрямую нельзя. Вызываемая функция использует какие-нибудь "грязные" методы типа вычисления адреса стека?
Там хуйня типа:
Смысл трамплина остаётся неясным.
Meltdown это когда ты тренишь предиктор чтобы он выполнил левый код, который считает данные в кеш, и потом замеряешь скорость чтения с кеша
Типа кококо-защита от реверсинга, но похоже что хуита.
>З.Ы. А у этого трамплина только одна реализация? Или есть какая-то другая под #ifdef'ом?
Только одна.
Тащемта, похоже что ЭТО надо выжечь калёным железом.
Ололо
ps что с гк творится? почему 500е постоянно?
неужели задрочили самопальными приблудами и бесконечными стоками?
Сам токошто гневный комент пейсал, так ГКшный эксепшен его скушал.
Так учил Фредерик Брукс в 1963 г.
leave в свою очередь является аналогом такого кода:
Есть даже срачи на тему, что работает быстрее. Это примерно как inc eax и add eax, 1 или lea eax, [eax+1].
Вангую что в темные века между 386 (когда стало можно адресоваться по sp) и, примерно, 2006 годом, им никто не пользовался ибо frame pointer omition
Причём компилятор мог генерировать непарные enter/leave. Легко могло быть push bp; mov bp, sp + leave или enter + pop bp (ага, mov sp, bp компилятор мог пропустить, если был "уверен", что никто не портит стек).
Ой да ладно, конпелятору не так уж и сложно трекать сколько байт он наклал на стек... Единственный случай, где FPO реально не заюзать -- функция с alloca.
З.Ы. А в 16-битном коде об SP нельзя было адресоваться, так что там BP без вариантов и никакого FPO.
А где-то можно адресоваться через SP?
З.Ы. Разве что въебать 67h, нагло заюзать [esp] прямо из 16-битного кода и молиться, чтобы никто не насрал в старшую половину esp. Всё равно чистых 8086 в природе уже нет.
А старшую половину esp можно обнулить. Безо всякой зелени. Видел 16-битные библиотеки, оптимизированные под 386. В них использовались префиксы 66h и 67h, чтобы воспользоваться новыми плюшками, находясь в 16-битном сегменте. И там как раз приходилось инициализировать старшие половинки регистров.
На некоторых прошивках видно, что после вызова "реалмодного" прерывания меняется IDTR. Т.е. CSM иногда зачем-то бегает в защищёнку и есть риск, что он и старшие части регистров хуёво сохранит и помнёт.
Нахуй и в пизду, короче. Разве что под CLI и с обнулением прямо перед использованием...
именно тем и руководствовались питухи, когда выпиливали frame pointer.
А потом без символов стек не прочитать
>>А в 16-битном коде об SP нельзя было адресоваться,
даже на совр. процах?
Косвенная адресация использует либо байт mod R/M, либо s-i-b. В mod R/M нет варианта [SP]. Даже в 32-битном и в 64-битном режиме нет варианта [ESP]/[RSP]. А s-i-b, в котором есть [ESP]/[RSP] в 16-битном варианте недоступен.
Отдельной инструкции, использующей [SP], в сетке команд нет.
Единственный способ адресоваться в 16-битном коде об SP, это использовать префикс размера адреса. Т. е. писать mov ax, word ptr [esp] вместо mov ax, word ptr [sp], предварительно обнулив старшую половинку регистра esp, чтобы в ней не было мусора. А об этом уже написал bormand: придётся оборачивать код в CLI/STI, чтобы какой-нибудь обработчик прерывания не засрал старшую половину регистра.
З.Ы. Лол, оказывается даже суперкомпьютер с 65536 однобитных процессоров был...
http://www.brouhaha.com/~eric/retrocomputing/motorola/mc14500b/
Там для большинства задач даже переходы нинужны были. Команды тупо исполнялись по кругу. Зато инженерам не надо было учиться программировать, они брали схему на реле и дословно переносили её на асм этого контроллера.
?
Что-то вроде частичного применения.
Ну почему нет частичного применения на уровне языка?
foo 2, 2
->
foo 4
неужто нет ключ слова у копелятора?
>>З.Ы. А у этого трамплина только одна реализация?
конечно, есть еще и такая
void trampoline(void (*func)(void), bool flag)
{
if (flag)
func();
else
trampoline(func, false);
}
ахахахахах
Сперва прочитал как traponline
Ты пишешь под браузер или только под ноду?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Browser_compatibility
Но у нас всё равно Бабель, может быть для let или import
foo + bar это обычно foo[bar]
Идеи кастов в JS ещё можно понять: удобно, когда пишешь "form.y.value = form.x.value * 10" и не отвлекаешься на преобразования.
Но это перемешивание индексов - какая-то питушня. "Вдруг программист случайно перепутает массив и индекс - с кем не бывает - а наш язык ему поможет".
Эта питушня наверное походит еще со времен, когда С считался непозволительной роскошью из-за оверхеда над ASM.
> "Вдруг программист случайно перепутает массив и индекс - с кем не бывает - а наш язык ему поможет".
Скорее мысль была такая "в случае x[y] заменяем и интерпретируем как *(x + y) ибо надо сэкономить пару байт кода компилятора"