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
В некоторых языках программирования (например, Фортран) строки символов занимают все статически отведенное им место, дополняя тест строки до размера отведенного места пробелами. При обработке таких строки приходится сталкиваться каждый раз с проблемой отсечения или пропуска незначимых или ненужных пробелов. Более совершенный механизм работы со строками используют более поздние языки высокого уровня, например, Си и Паскаль.
В этих языках используются строки переменной длины. Под размещение таких объектов также отводиться фиксированный объем памяти, но используется он не весь целиком, а только та часть, которая необходима для размещения строки. При этом возникает необходимость отделения в каком-либо виде полезной информации от неиспользуемой части памяти. Решений этой проблемы может быть несколько. Например, в языке Си введен специальный символ с нулевым кодом, который трактуется как признак конца строки:
String DB ‘Это строка Си’,0
Другое решение принято в Паскале: длина строки указывается в нулевом байте памяти, отведенной под строку.
String DB Len-1,’Это строка Паскаля’
Len=$-String
Можно долго спорить о достоинствах и недостатках каждого из предложенных решений. В первом случае, как правило, говорят о том, что строки могут быть произвольной длины, но длину их нужно при необходимости каждый раз вычислять заново, во втором – о том, что длина строк не может быть более 255 байт, зато она всегда известна без проведения каких либо дополнительных вычислений и т.п.
Обработка прерываний является одним из неотъемлемых механизмов работы любого компьютера. Запросы на обработку прерываний могут быть результатом работы программы или аппаратуры. Аппаратные прерывания могут возникать из-за поступления сигналов от внешних устройств (внешние прерывания) или инициализироваться процессором из-за ошибок в работе программы, например, деления на нуль (внутренние прерывания). Программные прерывания это прерывания вызванные командой int. Не зависимо от природы прерывания реакция на них процессора происходит одним и тем же образом: сначала производится сохранение в стеке текущей задачи содержимого регистра флагов, регистра сегмента команд (CS) и счетчика команд (IP). После этого процессор готов к переходу на программу обработки прерывания. Для этого необходимо загрузить новые значения в CS и IP для того, это и будет осуществлением указанного перехода. Где взять эти новые значения? Дело в том, что самое начало оперативной памяти от адреса 0000h до адреса 03ffh отводиться под векторы прерываний. Каждый вектор – это четыре байта, содержащие адресную пару программы обработки соответствующего прерывания. Два старших байта содержат сегментную часть, а два младших – смещение.
Вектор прерывания с номером n располагается в байтах памяти от 4*n до 4*n+3. Всего на выделенном участке памяти могут располагаться 256 векторов прерываний.
Большая часть векторов прерываний предназначена для выполнения определенных действий и автоматически заполняется адресами системных программ при загрузке системы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.