Assembler для начинающих

Команда форматирования



Команда форматирования


    Команда форматирования инициализирует новую дискету.  Когда вы
    инициализируете дискету, происходит запись на нее маркеров
    идентификации секторов.  Эти поля контроллер использует при
    операциях чтения и записи для опознавания секторов.  Например, во
    время операции чтения BIOS посылает четыре байта идентификации
    сектора в контроллер дисковода.  Эти четыре байта обычно
    соответствуют номеру дорожки, номеру головки, номеру сектора и
    размеру сектора, и называются номером цилиндра-головки-записи CHRN.
    Контроллер использует значение номера CHRN сравнивая его со
    значениями, записанными в поля идентификации секторов во время
    форматирования.
      Это означает, что контроллер не обращает внимания на то, что


    записано в поле номера CHRN на дискете, т.е. сектора могут
    пронумерованы в произвольном порядке, не от первого до восьмого на
    каждой дорожке. Как только контроллер находит сектор, у которого
    поле номера CHRN совпадает с заданным, он читает сектор. Значения
 
             Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:06:20
             Фиг. 9.5 Форматирование дискеты                     Page     1-1
 
                                           PAGE ,132
                                           TITLE      Фиг. 9.5 Форматирование дискеты
              0000                        STACK      SEGMENT STACK
              0000      0040[                   DW   64 DUP (?)
                      ????
                                ]
              0080                        STACK      ENDS
              0000                        CODE SEGMENT
                                           ASSUME  CS:CODE,ES:CODE
              0000      00 00 01 02 00 00 02    ID_BUFFER  DB   0, 0, 1, 2, 0, 0, 2, 2
                  02
              0008      00 00 03 02 00 00 04                DB   0, 0, 3, 2, 0, 0, 4, 2
                  02
              0010      00 00 05 02 00 00 06                DB   0, 0, 5, 2, 0, 0, 6, 2
                  02
              0018      00 00 07 02 00 00 08                DB   0, 0, 7, 2, 0, 0, 8, 2
                  02
 
              0020                        FORMAT  PROC     FAR
              0020      1E                      PUSH DS         ; Адрес возврата в ДОС
              0021      2B C0                   SUB  AX, AX
              0023      50                      PUSH AX
 
              0024      8D 1E 0000 R                  LEA  BX, ID_BUFFER    ; Занесение адреса буфера в ES:BX
              0028      0E                      PUSH CS
              0029      07                      POP  ES
              002A      B9 0001                  MOV  CX, 1            ; Трек 0, сектор 1
              002D      BA 0000                  MOV  DX, 0            ; Дисковод 0, сторона 0
              0030                        TRACK_LOOP:
              0030      8D 3E 0000 R                  LEA  DI, ID_BUFFER    ; Необходимо для занесения номера
              0034      B0 08                   MOV  AL, 8            ;  трека в буфер форматирования
              0036                        ID_SETUP:
              0036      26: 88 2D               MOV  ES:[DI], CH      ; Занесение номера трека (цилиндра)
              0039      83 C7 04                ADD  DI, 4            ; Переход на следующее поле
              003C      FE C8                   DEC  AL
              003E      75 F6                   JNZ  ID_SETUP   ; Цикл по полям в буфере
              0040      B8 0501                  MOV  AX, 501H   ; Форматирование
              0043      CD 13                   INT  13H
              0045      FE C5                   INC  CH         ; Переход на следующий трек
              0047      80 FD 40                CMP  CH, 40H    ; Все сформатировано?
              004A      75 E4                   JNE  TRACK_LOOP ; Цикл по трекам
              004C      CB                      RET              ; Возврат в ДОС
              004D                        FORMAT  ENDP
              004D                        CODE ENDS
                                           END  FORMAT
 
             Фиг. 9.5 Форматирование дискеты
   номера CHRN контроллер помещает на дискету во время операции
    форматирования. Вы имеете возможность записать в качестве значений
    номера CHRN любые значения, которые выберете. Буфер данных для
    команды форматирования содержит байты номера CHRN для каждого
    сектора дискеты. Это означает, что буфер данных может содержать
    например такие значения:
 
      DB    10,0,1,2,10,0,2,2
      DB    10,0,3,2,10,0,4,2
 
      для дорожки 10 стороны 0 дискеты. Это пример поля данных,
    которое использует команда FORMAT операционной системы PC DOS или
    MS DOS. На Фиг. 9.5 показана программа, которая форматирует
    одностороннюю дискету с обычными значениями номера CHRN. Заменять
    этой программой команду FORMAT операционной системы PC DOS нельзя,
    так как система PC DOS также проверяет дискету и записывает на
    дискету справочник и таблицу расположения файлов. Еще вы можете
    заметить, что эта программа сразу же после запуска начинает
    форматировать дискету в дисководе A:. Вы должны быть готовы к
    этому, если собираетесь выполнить эту программу.
 
      Вы можете использовать команду форматирования в том случае,
    если хотите защитить дискету от копирования. Защита от копирования
    означает, что дискета шифруется таким образом, что ее становится
    трудно скопировать. Так как утилита DISKCOPY предполагает, что
    идентификаторы секторов записаны обычным образом, она не может
    копировать дискету с не стандартными номерами секторов. Записав на
    дискету идентификатор сектора, отличный от нормального, вы защитите
    ее от копирования.
 
      В качестве примера давайте защитим дискету от копирования,
    записав не стандартный номер сектора на дорожку 10. Пример,
    приведенный выше, показывает обычные номера секторов. Если вместо
    них буфер данных будет содержать значения DB 10, 0, 10, 2, 10, 0,
    2, 2 DB 10, 0, 3, 2, 10, 0, 4, 2
 
      дорожка 10 не будет иметь сектора 1. Вместо него на ней
    появится сектор 10, которого не бывает на нормальной дискете
    системы PC DOS. Программа DISKCOPY не может скопировать дорожку 10
    правильно. Если теперь данная программа проверит (с помощью команды
    проверки) наличие сектора 10 на дорожке 10 дискеты, отсутствие
    ошибки будет означать, что дискета оригинальная, а не копия.
 
      Этот способ защиты от копирования не совсем надежен. Каждый
    опытный пользователь (и даже некоторые программы копирования) могут
    обнаружить защиту такого типа и обойти ее. Но модификация
    идентификаторов секторов не может производиться произвольно. Для
    определения адреса установки головок BIOS использует номер дорожки
    из поле CHRN, так что номер цилиндра должен соответствовать номеру
    цилиндра, на котором находится сектор. Код в байте номера головки
    определяет установку электронного переключателя, выбирающего
    головку, поэтому это значение должно быть задано корректно. Длина
    поля берется из таблицы параметров, а не из регистров при вызове,
    так что ее изменить трудно. К тому же, это число использует и BIOS,
    и контроллер, определяя длину сектора, так что изменить его вы
    сможете только после тщательной подготовки. Свободно изменяемым
    остается только номер сектора. Перед тем, как вы начнете изменять
    номера секторов, запомните, что если при этом вы собираетесь еще
    использовать эту дискету в рамках DOS, система будет пытаться
    использовать сектор, который вы заменили сектором со своим
    нестандартным номером, если вы не модифицируете таблицу
    расположения файлов дискеты так, чтобы зарезервировать этот сектор.
    Если вам нужно считывать по нескольку секторов (что позволяет
    драйвер дисковода BIOS), номера у секторов должны быть
    последовательными, но не обязательно начинаться с первого.
 
      В общем, команда форматирования дает некоторое средство защиты
    от копирования. Однако абсолютно надежный метод защиты еще не
    найден. Только хороший выбор техники шифрования поможет оставить
    честных людей честными.




Содержание раздела