┌──┌─┐┌──
──┘├─┘──┘ Presents
┐ ┌┐┐┌─┤ VMag, Issue 1, 1 June 1997
└─┘┘ ┘└─┘ ──────────────────────────
Теория чисел - вирумэйкерам ;).
Один из разработчиков MS-DOS - Mark Zbikovski, в честь
которого и по сей день exe-файлы отмечены сигнатурой 'MZ'. Именно
по этой сигнатуре (а не по расширению) DOS различает exe- и
com-файлы. И все бы было хорошо, если бы не мания величия Марка -
с таким же успехом может использоваться и сигнатура 'ZM'. Это
создает некоторые неудобства при определении типа исполняемого
файла.
Системный загрузчик DOS делает это следующим образом:
3D4D5A cmp ax,5a4dh ; 'MZ'
74?? je exe
3D5A4D cmp ax,4d5ah ; 'ZM'
74?? je exe
Мы предлагаем более другой способ:
F7D0 not ax
F6E4 mul ah
3DBA72 cmp ax,72bah ; not'M'*not'Z'
74?? je exe
Короче на байт и не так в глаза бросается.
Может возникнуть подозрение, что такую проверку могут
удовлетворить ;) какие-то другие сочетания двух байт, например,
'MK' (Morshchakin-Kopec) или 'KM' (соответственно)... Докажем,
что это подозрение беспочвенно.
Дано уравнение not(x)*not(y)=(not'M')*(not'Z'). Докажем,
что существует только два решения данного уравнения: ('M','Z') и
('Z','M') при условии, что x<256, y<256, x и y принадлежат
множеству натуральных чисел ;).
Доказательство:
not'M' = 178 = 2*89 ─┬──── разложили на простые
not'Z' = 165 = 3*5*11 ─┘ множители.
Тогда (not'M')*(not'Z') = 2*3*5*11*89.
a=not(x)<256, b=not(y)<256, a*b=2*3*5*11*89. Т.е. один из
множителей, например a, должен делиться на 89.
Т.к. 256 div 89 = 2, то очевидно, что a=89 или a=2*89.
При a=89 -> b=2*3*5*11=330>255, при a=2*89 -> b=3*5*11, что и
требовалось доказать.
//KAA/Scout