Структура префикса программного сегмента. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Структура префикса программного сегмента.



Поле Смещение от начала PSP Размер поля (десятичн) Значение
  0h 2 байт Команда INT 20h
  2h 2 байт Размер памяти в параграфах
  4h 1 байт Резерв, обычно 0
  5h 5 байт Вызов диспетчера функций DOS
  Ah 4 байт Вектор завершения работы (Адрес завершения CS:IP)
  Eh 4 байт Вектор прерывания работы (Адрес выхода Ctrl-Break)
  12h 4 байт Вектор ошибки (Адрес выхода по ошибке)
  16h 22 байт Используется DOS
  2Ch 2 байт Указатель строки связи с окружающей средой
  2Eh 34 байт Рабочая область DOS
  50h 3 байт Коменды INT 21h, RETF
  53h 2 байт Зарезервировано
  55h 7 байт Расширение FCB #1
  5Ch 9б айт FCB #1
  65h 7 байт Расширение FCB #2
  6Ch 20 байт FCB #2
  80h 1 байт Длина параметров
  81h 127 байт Параметры
  80h 128 байт Область передачи информации

 

Поле 1 содержит байты CD20, то есть команду INT 20h.

Прерывание INT 20h используется для завершения программы и передачи управления DOS. Прерывание INT 20h эквивалентно AH=0 (функции 0) INT 21h. INT 20h не закрывает все открытые этой программой файлы.

Более совершенная функция выхода из программы 4Сh -завершает работу программы и передает тому, кто ее вызвал, код возврата. Если программа была вызвана как подпрограмма, то вызвавшая ее программа может получить код возврата с помощью функции 41h. Если программа вызывалась командой DOS, то код возврата может быть проверен в командном файле с помощью команды ERRORLEVEL. Код возврата возвращается в AL/ При выполнении этой функции DOS автоматически закрывает все файлы, открытые с помощью 3Dh и, возможно, 3Сh.

Итак, команда INT 20h находится в начале PSP. Таким образом, можно выйти из программы, просто передав управление на эту ячейку (при условии, что CS указывает на PSP).

Размещение в начале PSP команды INT 20h может быть объяснено тем, что если LINK обнаруживает в программе неудовлетворенную внешнюю ссылку, то он присваивает ее адресу смещения 0. при передаче управления на эту ссылку выполнится команда, находящаяся в начале PSP, то есть INT 20h, - что вызовет завершение программы.

 

Поле 2 – сколько памяти доступно – содержит номер последнего блока памяти, доступной DOS. Умножив это число на 16, получим общий объем памяти в байтах. То же самое значение, что и в поле 2, возвращает команда CHKDSK DOS. Если программе необходима вся доступная память, то она должна использовать это поле PSP для определения того, сколько памяти она может использовать.

Программа также может получать и возвращать память с помощью вызова функции 4Аh.

 

Поле 4. Это команда вызова с аттрибутом дистанции FAR диспетчера функций DOS. Следовательно, эта команда содержит полный адрес диспетчера. Этот полный адрес не только указывает на диспетчера, но при этом его смещение указывает, сколько памяти в сегменте команд мы можем использовать (до FFF0, то есть на 16 байт меньше, чем 64 КБайт). Это смещение расположено в PSP со смещением 6, сразу за кодом команды, имеющим смещение 5.

Это поле, в отдличие от предыдущего, должно работать с большинством многооконных и мультипрограммных систем. Если DOS может предоставить более 64 Кбайт, то определить, на сколько больше, мы можем по полю 2.

 

Поля 5, 6 и 7.

Это полные адреса, для трех прерываний по завершению работы, по Ctrl-Break (Ctrl-C) и по ошибке. Если мы хотим использовать свои программы для обработки этих ситуаций, то должны временно изменить эти слова. В конце работы вектора должны быть восстановлены.

 

Поле 9.

Полный адрес набора строк описания окружающей среды. это набор ASCIIZ строк. каждая строка имеет форму

ИМЯ = значение

Обычно эта среда содержит по крайней мере имя СОМSPEC (используемое DOS для поиска на диске файла COMMAND.COM).

 

Поле 11.

Содержит команды INT 21H и команду возврата управления вызвавшей программе RETF (так как RET с дальним аттрибутом дистанции FAR).

Таким образом, вместо INT 21h мы можем косвенно через смещение в PSP вызвать эту команду.

 

Поля 13, 14, 15 и 16.

FCB (File Control Block)

Устаревший способ работы с файлами.

 

Поля 17, 18.

Обеспечивают нашим программа доступ к параметрам командной строки. Поле 17 содержит полную длину строки параметров (которая может быть от 0 до 127), а поле 18 – ее содержимое.

Передаваемая строка не содержит имя вызванной программы. Строка начинается с символа, следующего в команде вызова сразу за именем программы; обычно это пробел. Разделители, пробелы и запятые не отбрасываются и не снимаются. Любые параметры переадресации ввода/вывода (такие как < -ввод и > - вывод) изымаются DOS и строка реконструируется таким образом, как будто этих элементов не было вообще. В результате этих двух операций программа не может узнать о переадресации стандартного ввода-вывода и не может узнать свое собственное имя.

 

Поле 19.

Это область, которая по умолчанию используется DOS для обмена данными с диском (DTA – Disk Transfer Area). Это буфер длиной 128 байт, имеющий смещение 80h. Используется всегда, когда мы пользуемся служебной процедурой DOS для обмена с диском, не задавая в качестве буфера свою собственную область.

 

ПРЕРЫВАНИЯ.

 

Прерывание (interrupt) – это аппаратная функция, вызывающая приостановку операций CPU, запоминание его состояния и выполнение специальной программы, которая называется программой обработки прерывания (interrupt service routine - ISR) или обработчиком прерывания (interrupt handler).

Существует три класса прерываний:

- внутренние

- внешние (аппаратные)

- программные

 

Внутренние прерывания инициируются состоянием самого процессора (например, деление на ноль)

Внешние – сигналом, подаваемым в CPU другими компонентами вычислительной системы (например, при любом нажатии на клавишу).

Программные прерывания – специальной командой INT.

 

Независимо от источника, действия CPU по обслуживанию прерывания всегда выполняются одинаково, как для аппаратного, так и для программных прерываний.

Микропроцессоры семейства 8086 способны обрабатывать 256 типов прерываний. Каждое прерывание имеет номер от 0 до 255.

Начало оперативной памяти от адреса 0000h до 03FFh отводится под векторы прерываний. Вектор прерывания – это 2 слова памяти (4 Байта), в которых хранятся адреса программ обработки прерываний (ISR). В старшее слово записывается сегментный адрес ISR, в младшее слово – сещение ISR, то етсь относительный адрес точки входа ISR в сегменте. Вектор 0 располагается, начиная с адреса 0, вектор 1 – с адреса 4, вектор 2 – с адреса 8 и т.д. Вектор с номером N занимает, таким образом, байты с N*4 до N*4+3.

 
 

 

 


Получив сигнал на выполнение процедуры прерывания с определенным номером, CPU сохраняет в стеке выполняемой программы текущее содержимое трех регистров процессора: регистра флагов, CS и IP. Два последних образуют полный адрем возврата в прерванную программу. Далее процессор загружает CS и IP из соответствующеговектора прерывания, осуществляя тем самым переход на ISR.

Программа ISR обычно заканчивается командой возврата из прерывания iret (interrupt return - возврат из прерывания), которая выполняет обратные действия - загрузку IP, CS и регистра флагов из стека, что приводит к возврату в основную программу.

Большая часть векторов прерывания предназначена для выполнения определенных действий и автоматически заменяется адресами системных программ при загрузке системы; часть векторов зарезервирована для будущих применений, а часть (конкретно с номерами 60h...66h) свободна и может использоваться в прикладных программах.

Программные прерывания служат удобным интерфейсом между прикладными программами и DOS. На самом деле они ничего не прерывают, а являются формой обращения к процедуре. Когда программе требуется выполнение какой-либо функции DOS, она вызывается, обрабатывая соответствующее прерывание. При этом можно не знать, в каком месте ОП находится подпрограмма, реализующая функцию, и тем более, что физические адреса компонентов DOS могут меняться.

 


code_seg segment

assume cs:code_seg, ds:code_seg, ss:code_seg

org 100h

start:

jmp begin

line db 2

column db 10

sym db 01h

;

begin:

mov ah,25h;функция заполнения вектора прерывания

mov al,65h;номер вектора

mov dx,offset new_65h;смещение обработчика

int 21h

;

gogo:

int 65h

mov ah,02h;функция позиционирования

mov bh,0;видеостраница

mov dh,line;строка

mov dl,column;столбец

int 10h

;

mov ah,0ah;функция вывода символа без атрибута

mov al,sym;символ

mov bh,0;видеостраница

mov cx,60;коэффициент повторения

int 10h

;

inc sym;следующий символ

inc line;следующая строка

mov ah,08h;функция вывода без эха,

; чувствительна на Ctrl+C

int 21h

;

jmp gogo

;

new_65h proc near

mov ah,06h;функция задания окна

mov al,0;режим создания (нет прокрутки)

mov bh,1bh;атрибут всех символов в окне

;(светло-бирюзовые символы, синий фон)

mov cx,0;левый верхний угол 0,0

mov dh,24;нижняя Y-координата

mov dl,79;правая X-координата

int 10h

iret

new_65h endp

code_seg ends

end start



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 267; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.95.244 (0.023 с.)