В процессе восстановления исходного текста программы, про которую я рассказывал
в давнем году, нашлась вот такая функция (выдача скрипта-декомпилятора слегка причёсана и приведена к сишному виду):
int func(int arg1, int arg2, int arg3) {
if (arg2 >= 3) goto a;
arg3 = arg3 - 1;
a:
arg2 = arg2 + 011;
if (arg2 <= 013) goto b
(
Read more... )
Comments 10
Reply
Если, в конце концов, решиться дизассемблировать всю операционную систему, то можно, наверное, замахнуться на прикручивание Radare, но современные тулзы настолько не рассчитаны на словные архитектуры с длиной слова, не кратной степени двойки, что ну его нафиг.
Reply
Параметры - день, месяц, год.
Reply
Reply
Reply
Reply
Reply
28 в конце, конечно, не нужно. Вопрос на понимание текста :) : откуда оно там взялось?
Reply
Так, про формулу Целлера все уже ответили. Про -28 в конце: оригинальная формула Целлера под "остатком от деления на 7" подразумевает, строго говоря, не остаток, а модуль, величину заведомо положительную. А сишный % и аппаратура большинства процессоров выдают "остаток со знаком делимого". Поэтому для практического использования формулы нужно сделать величину, от которой берём остаток, либо заведомо положительной (прибавив, ну, скажем, 42), либо заведомо отрицательной (вычтя, ну, скажем, 28, и находя потом название дня недели по отрицательному смещению).
Бойцы вспоминают минувшие дни: единственная реальная проблема 2000 года, с которой я столкнулся, заключалась именно в этом: в коде эта константа была недостаточной, и в 2000 году день недели становился отрицательным. Исходников не было, после дезассемблирования проблема была решена нахождением нужного байта и увеличением его на 42. Я ответил на вопрос?
P.S. Кстати, в Аде есть обе эти операции отдельно, называются mod и rem. Чтобы человек сознательно выбирал, какая из двух ему сейчас ( ... )
Reply
Отличие от оригинальной формулы в том, что понедельник сделан первым днём недели, как было положено в СССР.
Reply
Leave a comment