В последней главе, в которой мы рассмотрели видеослужбы ROM BIOS, у нас были все основания рекомендовать вам непосредственно использовать службы ROM BIOS в тех ситуациях, когда система DOS или выбранный вами язык программирования не обеспечивали поддержки нужных для вас функций. Однако в случае использования служб ROM BIOS для диска положение совсем другое.
Когда приходится иметь дело с операциями для диска, выполнение которых обычно необходимо при работе программы, то все функции по управлению и манипулированию вводом/выводом следует предоставить системе DOS и осуществлять их с помощью либо файловых служб, имеющихся в языке программирования, либо служб самой системы DOS (см. гл.14 — 18). На это имеется несколько причин. Главная причина состоит в том, что значительно проще предоставить возможность системе DOS сделать всю необходимую работу. Средства DOS примут на себя ответственность за выполнение всех основных операций с диском, включая форматирование и присвоение метки дискам, каталогизацию файлов, а также основные операции по чтению и записи. На практике в большинстве случаев нет необходимости углубляться в детали системного программного обеспечения. Однако возможно, что иногда вы захотите напрямую работать с данными на диске в более полном объеме, обычно это делается при обеспечении защиты от копирования. Именно тогда вам следует использовать службы ROM BIOS.
В нашем примере мы будем применять язык Си для вызова пары подпрограмм, использующих функции ROM BIOS 02H и ОЗН для чтения и записи конкретных секторов диска. Мы начнем с определения того, как мы хотим, чтобы выглядел интерфейс при использовании языка Си. Это иллюстрирует следующая программа. Если вы не знакомы с языком Си и не хотите разбираться в данной программе, можете не обращать на нее внимание, а потратить все время на изучение примера интерфейса, представленного на языке ассемблера, который идет следом за данной программой.
Данный фрагмент на языке Си показывает, как можно вызывать службы чтения и записи ROM BIOS из языка высокого уровня. Функции ReadSectorO и WriteSectorO — две программы на языке ассемблера, использующие прерывание 13Н для обращения к службам ROM BIOS для диска. Параметры вам уже знакомы: С, Н и R являются номерами цилиндра, головки и сектора, которые мы описали ранее. Компилятор языка Си передает адрес буфера в виде адресов сегмента и смещения, так как тип передачи задан явно (char far).
Форма интерфейса на языке ассемблера будет вам понятна, если вы прочтете общие замечания в гл.8 или же изучите пример из гл.9. Данные ассемблеровские программы копируют параметры из стека в регистры. Хитрость заключается в том, как обрабатывается номер цилиндра: два старших байта 10-битового номера цилиндра объединены с 6-битовым номером сектора в CL.
Следует обратить внимание на то, как в подпрограмме DiskService реализован командный код, осуществляющий копирование параметров из стека в регистры. Когда вы будете работать со службами ROM BIOS для диска, вы обнаружите, как часто будут использоваться подпрограммы, похожие на DiskService. Это связано с тем, что для большинства служб ROM BIOS для диска приняты сходные назначения регистров под параметры.
|