• CS = StartSeg+ReloCS;
• IP = Exelp;
• содержимое остальных регистров не имеет значения. Регистры сегмента кода CS и указателя инструкций IP обычно инициируются следующими тремя командами:
PUSH StartSeg+ReloCs
PUSH Exelp
RETF
(команда RETF дальнего возврата из подпрограммы извлекает из стека два слова — смещение и сегмент адреса перехода — и помещает их соответственно в IP и CS).
Таким образом, сразу после получения управления фаг должен сохранить значения регистров АХ и DS и поместить в DS значение собственного сегмента данных. На практике сегмент данных в коротких ассемблерных программах обычно совпадает с сегментом кода, т.е. программа и данные размещаются в одном сегменте. Сегмент стека 55 можно не изменять, т.к. программа-установщик фага должна позаботиться о том, чтобы стек не разрушил код самого фага, и соответствующим образом настроить ReloSS и/или ExeIP. Обычно в ЕХЕ— программе начальное значение ReloSS таково, что стек размещается сразу за концом программы, т.е. в том месте, куда программа-установщик помещает код фага. Длина стека ExeSP как правило более чем достаточна для того, чтобы работа фага со стеком не привела к разрушению кода фага, поэтому в большинстве случаев установщик оставляет начальные значения ReloSS и ExeSP без изменения.
6.4.1. Описание программ SetFag.pas и Fng.asm
В этом параграфе описываются программы SetFag.pas и Fag.asm, с помощью которых реализуется описанный выше механизм защиты. Программа SetFag (прил.П8.1) осуществляет установку фага, а программа Fag.asm (прил.П8.2) содержит сам фаг. Если Вы захотите воспользоваться предлагаемыми программами, откомпилируйте Турбо Ассемблером файл Fag.asm командой
tasm fag /L
В ходе компиляции на экран будет выведено 13 предупреждений вида *Warning* Open procedure: XXXXXX
а в конце — сводка
Error message: None Warning message: 13 Passes: 1 Remainig memory: XXX К
Если в строке Error message вместо None указано число обнаруженных ошибок, просмотрите файл листинга компиляции fag.Ist, отыщите в нем сообщения компилятора об ошибках и устраните их. Затем преобразуйте полученный файл fag.obj в программу Fag.prg командой
tlink fag, fag.prg