Сложные структуры данных. Перечислимые типы данных. Прерывания пользователя, страница 5

jmp   m6

no:    mov  ax,-1

m5:   LoadReg   <ax,dx,cx,bx>

ret

find   endp

clear proc

SaveReg   <ax,dx>

mov  ax,bx

shr    bx,3                     ; номер байта

and   ax,07h                 ; и еще сдвиг на несколько бит

mov  ah,0feh

push cx

mov  cl,al

rol     ah,cl                    ; сдвиг маски в позицию первого бита

pop   cx

m16: and   status[bx],ah   ; заполнение 1 маски отводимого поля

dec   cx

jz       m15

rol     ah,1

cmp  ah,0feh

jnz     m16

inc    bx

jmp   m16

m15: LoadReg   <dx,ax>

ret

clear endp

end   main

8.8. Строки переменной длины

В некоторых языках программирования (например, Фортран) строки символов занимают все статически отведенное им место, дополняя тест строки до размера отведенного места пробелами. При обработке таких строки приходится сталкиваться каждый раз с проблемой отсечения или пропуска незначимых или ненужных пробелов. Более совершенный механизм работы со строками используют более поздние языки высокого уровня, например, Си и Паскаль.

В этих языках используются строки переменной длины. Под размещение таких объектов также отводиться фиксированный объем памяти, но используется он не весь целиком, а только та часть, которая необходима для размещения строки. При этом возникает необходимость отделения в каком-либо виде полезной информации от неиспользуемой части памяти. Решений этой проблемы может быть несколько. Например, в языке Си введен специальный символ с нулевым кодом, который трактуется как признак конца строки:

String         DB    ‘Это строка Си’,0

Другое решение принято в Паскале: длина строки указывается в нулевом байте памяти, отведенной под строку.

String         DB Len-1,’Это строка Паскаля’

Len=$-String

Можно долго спорить о достоинствах и недостатках каждого из предложенных решений. В первом случае, как правило, говорят о том, что строки могут быть произвольной длины, но длину их нужно при необходимости каждый раз вычислять заново, во втором – о том, что длина строк не может быть более 255 байт, зато она всегда известна без проведения каких либо дополнительных вычислений и т.п.

8.9. Прерывания пользователя

Обработка прерываний является одним из неотъемлемых механизмов работы любого компьютера. Запросы на обработку прерываний могут быть результатом работы программы или аппаратуры. Аппаратные прерывания могут возникать из-за поступления сигналов от внешних устройств (внешние прерывания) или инициализироваться процессором из-за ошибок в работе программы, например, деления на нуль (внутренние прерывания). Программные прерывания это прерывания вызванные командой int. Не зависимо от природы прерывания реакция на них  процессора происходит одним и тем же образом: сначала производится сохранение в стеке текущей задачи содержимого регистра флагов, регистра сегмента команд (CS) и счетчика команд (IP). После этого процессор готов к переходу на программу обработки прерывания. Для этого необходимо загрузить новые значения в CS и IP для того, это и будет осуществлением указанного перехода. Где взять эти новые значения? Дело в том, что самое начало оперативной памяти от адреса 0000h до адреса 03ffh отводиться под векторы прерываний. Каждый вектор – это четыре байта, содержащие адресную пару программы обработки соответствующего прерывания. Два старших байта содержат сегментную часть, а два младших – смещение.

Вектор прерывания с номером n располагается в байтах памяти от 4*n до 4*n+3. Всего на выделенном участке памяти могут располагаться 256 векторов прерываний.

Большая часть векторов прерываний предназначена для выполнения определенных действий и автоматически заполняется адресами системных программ при загрузке системы.