Записи
Записи, как и структуры, представляют собой шаблоны, накладываемые на реальные данные с целью введения удобных мнемонических обозначений отдельных элементов данных. В отличие от структур, дающих имена байтам, словам, двойным словам или целым массивам, в записях определяются строки битов внутри байтов, слов или двойных слов.
Известно, что дата создания файла хранится в каталоге диска в виде 16-битового слова, в котором старшие 7 бит обозначают год (от 1980), следующие 4 бит – месяц и последние 5 бит – день (рис. 2.14).
Рис. 2.14. Формат записи даты в каталоге диска.
Эти данные удобно специфицировать с помощью записи filedate, определяемой в программе следующим образом:
fdate record year:7, month: 4, day:5
Ключевое слово record говорит о том, что имя fdate относится к записи, а мнемонические обозначения year, month и day являются произвольными именами отдельных битовых полей описываемого слона.
Включение в программу описания шаблона битовых полей позволяет отказаться от утомительного и чреватого ошибками определения "вручную" содержимого полного данного по задаваемым значениям его отдельных составляющих. Для приведенной выше записи объявления конкретных переменных будут выглядеть следующим образом:
file1 fdate <5.6.7>;7 июня 1985г. file2 fdate <18.12.30>;30 декабря 1998г. file3 fdate <>;"Пустая" (пока) переменная
Переменная filel будет определена, как число 0AC7h, file2 – как число 259Eh, а fileЗ – как число 0000h. При необходимости программного заполнения переменной типа fdate можно пользоваться именами ее составляющих, которые трактуются ассемблером, как индексы соответствующих битовых полей, отсчитываемые от младшего конца слова. Для приведенного примера day=0, month=5, a year=9. Однако в системе команд МП 86 практически нет средств работы с битовыми полями. Поэтому программное заполнение придется осуществлять с помощью команд сдвигов и логического сложения:
mov flle3.30;Помещаем день mov AX,12;Месяц пока в АХ mov CL,month;Будем сдвигать на month бит shl AX,CL; Сдвинули месяц в АХ на 5 бит or file3,AX;Добавили биты месяца в file3 mov AX, 18;Год пока в АХ mov CL,month;Будем сдвигать на year бит shl AX,CL;Сдвинули год в АХ на 9 бит or file3,AX;Добавили биты года в file3
В итоге в переменной file3 окажется тот же код 259Eh, что и в переменной file2.