[СП] Записи (Всякие мелочи)
Описание файла
Файл "[СП] Записи" внутри архива находится в папке "Всякие мелочи". Документ из архива "Всякие мелочи", который расположен в категории "". Всё это находится в предмете "системное программирование" из 4 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "системное программирование" в общих файлах.
Онлайн просмотр документа "[СП] Записи"
Текст из документа "[СП] Записи"
При описании записи для каждого элемента указывается его длина в битах и, что необязательно, некоторое значение. Суммарный размер записи определяется суммой размеров ее полей и не может быть более 8,16 или 32 битов. Если суммарный размер записи меньше указанных значений, то все поля записи «прижимаются» к младшим разрядам.
Использование записей в программе, так же как и структур, организуется в три этапа:
1) Задание шаблона записи, то есть определение набора битовых полей, их длин и, при необходимости, инициализация полей.
2) Определение экземпляра записи. Так же как и для структур, этот этап подразумевает инициализацию конкретной переменной типом заранее определенной с помощью шаблона записи.
3) Организация обращения к элементам записи.
Описание шаблона записи имеет следующий синтаксис:
имя записи RECORD <описание элементов>
При описании шаблона память не выделяется, так как это всего лишь информация для транслятора ассемблера о структуре записи. Так же как и для структур, местоположение шаблона в программе может быть любым, но при этом необходимо учитывать логику работы однопроходного транслятора.
Если инициализировать поля не требуется, то достаточно указать символ ? (вопрос) при определении экземпляра записи:
iotest, record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
flag iotest ?
Если составить тестовый пример с таким определением записи, то в отладчике
можно увидеть, что все поля переменной типа запись flag обнуляются. Это про-
исходит несмотря на то, что в определении записи заданы начальные значения
полей.
Если требуется частичная инициализация элементов, то они заключаются в угловые <> или фигурные {} скобки. Различие здесь в том, что в угловых элементы должны быть заданы в том же порядке, что и в определении записи. Если значение некоторого элемента совпадает с начальным, то его можно не указывать, но обязательно обозначить запятой. Для последних элементов идущие подряд запятые можно опустить.
К примеру, согласиться со значениями по умолчанию можно так:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
flag iotest <> ; согласились со значением по умолчанию
Изменить значение поля i2 можно так:
iotes t record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
flag iotest <,10,> ; переопределили i2
Применяя фигурные скобки, можно провести также выборочную инициализа-
цию полей, но при этом обозначать запятыми поля, со значениями по умолчанию
которых мы согласны, не обязательно:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
flag iotest {i2=10} ; переопределили i2
Ассемблер содержит оператор WIDTH, который позволяет узнать размер элемента записи в битах или полностью размер записи. Варианты применения оператора WIDTH:
width имя_элемента_записи – значением будет размер элемента в битах;
width имя_экземпляра_записи или width имя_типа_записи – значением будет размер всей записи в битах.
Например,
mov al,width i2
mov ax,width iotest
Подчеркнем еще раз то обстоятельство, что непосредственное обращение к конкретному элементу записи невозможно. Для этого нужно сначала выделить его, сдвинуть при необходимости к младшим разрядам, выполнить требуемые действия и поместить обратно на свое место в записи. Поэтому, чтобы вам каждый раз «не изобретать велосипед», далее мы опишем типовые алгоритмы осуществления этих операций над элементами записи. Вам останется лишь оформить эти алгоритмы в виде кода соответствии с требованиями конкретной задачи. Для выделения элемента записи требуется выполнить описанную далее процедуру:
1) Поместить запись во временную память — регистр (8-, 16- или 32-разрядный в зависимости от размера записи).
2) Получить битовую маску, соответствующую элементу записи, с помощью оператора MASK.
3) Локализовать биты в регистре с помощью маски и команды AND.
4) Сдвинуть биты элемента к младшим разрядам регистра командой SHR. Число разрядов для сдвига получить с использованием имени элемента записи.
В результате этих действий элемент записи будет локализован в начале рабочего регистра, и далее с ним можно производить любые действия
Работа с полем записи:
masm
model small
stack 256
iotes t record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00
.data
flag iotest <>
.code
main:
mov ax,@data
mov ds.ax
mov al,mask i2
shr al,i2 ;биты i2 в начале ах
and al,0fch ;обнулили i2
;помещаем i2 на место
shl -al,i2
mov Ы,[flag]
xor bl,mask i2 ;сбросили i2
or bl,al ;наложили
exit:
mov ax,4c00h
int 21h
end main