Сегментная структура программы. Система прерываний (2ч) — КиберПедия 

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Сегментная структура программы. Система прерываний (2ч)

2022-10-04 28
Сегментная структура программы. Система прерываний (2ч) 0.00 из 5.00 0 оценок
Заказать работу

 

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

{мет. сег.} SEGMENT ’code’

ASSUMECS:{ мет. сег.}, DS:{ мет. сег.}, SS:{ мет. сег.}

{мет. нач}: MOVAX{ мет. сег.}; загрузка в DS

MOVDS, AX;          адреса сегмента

MOVAX{код функции}

INT 21h

… DW …

… DB …

{ мет. сег.} ENDS

END{ мет. нач}

Рассмотрим директивы оформления программы:

1) SEGMENT

Для ассемблеров MASMили TASMимеет одинаковую структуру.

Общий вид:

{мет. сег.} SEGMENT[{счетный}] [{комбинационный}] [‘{класс}’]

где {мет. сег.} - имя сегмента, которое трактуется как метка

Атрибуты необязательны, но, если они есть, то очередность не меняется.

{счетный} – определяет метод выравнивания сегмента, т.е. начальный адрес.  

Возможны следующие варианты:

Атрибут

 

Граница

Примечания

Определяет Нач. адрес
Byte Байт Любой Не рекомендуется
Word Слово Четный  
Para Параграф Кратный 16 По умолчанию
Page Страница Кратный 256  
Dword Двойное слово Кратный 4 Есть только в TASM

 

{комбинационный} – показывает, как данный сегмент комбинируется с другим, имеющим ту же метку, но из другого исходного файла.

Ограничение: размер области ОП, которая получается в результате объединения сегментов, не должна превышать 64 Кбайта.

Пример:

PRIVATE, PUBLIC, COMMON, STACK идругие.

Если нет атрибута {комбинационный}, то сегмент не объединяется с другими.

‘{класс}’ –помогает компоновщику определить нужный порядок расположения сегментов при сборке из разных модулей. При этом все сегменты с одним классом объединяются в один последовательно, а с различными классами – располагаются в алфавитном порядке или в порядке появления.

Часто используются классы:

‘Code’ – сегмент команд, необходим для MASM, иначе не работает CV(CodeView) - отладчик;

‘Stack’ – необходим для TLINK, иначе не инициализируется сегмент стека;

 

2) ASSUME

Нужна для выполнения команд программы, которые неявно ссылаются на сегментные регистры МП (т.е. в примере – DS и CS). Она обеспечивает передачу адресов сегментов в соответствии с именами в эти регистры.

Общий вид:

ASSUMECS:{ метка}[, {сег. рег.}:{ метка 1}]

В приведенном примере эта директива означает, что DS и CS указывают на один и тот же сегмент, причем в CS адрес начала сегмента загружается автоматически, а в DS для этого требуются обычно две инструкции в начале сегмента кодов.

ASSUME может быть располагаться до начала первого сегмента.

В многосегментных программах могут быть описаны следующие сегменты:

Сег.рег. Сегмент Загрузка
CS сегмент кодов автоматическая
DS сегмент данных в программе
ES дополнительный сегмент данных в программе
SS сегмент стека автоматическая

3) ENDS

Указывает на конец текста сегмента.

Общий вид:

{ мет. сег.} ENDS

4) END

Указывает на конец исходного модуля (ИМ).

Общий вид:

END{ мет. начала}

где { мет. начала} – пусковой адрес, т.е. метка первой выполняемой строки ИМ, которой передается управление после компоновки (возможно имя процедуры).

Эта директива необходима, т.к. в начале сегмента кодов могут находиться процедуры, декларации и т.д.

Обычно программы состоят из 3-х сегментов (возможно четырёх). Расположение сегментов свободное, но рекомендуется порядок.

- сегмент данных,

- дополнительный сегмент данных,

- сегмент команд (кодов),

- сегмент стека, т.к. он может быть описан без расхода памяти.

Например,

Stack SEGMENT stack,‘stack’

DW 128 dup(?)

StackENDS

Объем стека обычно указывается в словах или байтах и не должен превышать 64КБ.

stack – комбинаторный атрибут, который позволяет компоновщику объединить стековые сегменты из разных ИМ.

‘stack’ – класс сегмента, необходимый для TLINK.

Использование прерываний

 

Система прерываний – важнейшая часть ПК, позволяющая быстро реагировать на события, обработка которых должна выполняться немедленно.

Прерывания бывают:

 - аппаратные (таймер клавиатуры, мыши и т.д.)

- внутренние – возбуждаются в самом МП (деление на 0 – несуществующая команда)

- программные – вызываются командой INT(interrupt) с числовым аргументом, который рассматривается как номер вектора прерывания.

Вектор прерывания (базовый вектор) – это обычно 2 слова.

 
ОП


                                                

IPобр. пр. 0 CSобр. пр. 0
IPобр. пр. 1 CSобр. пр. 1
...
IPобр. пр. n CSобр. пр. n
...
IP
CS
FLAGS

             
 
Вектор прерывания n  
Вектор прерывания 0
IP
CS
FLAGS

МП

 


Где обр. пр. i– обработчик прерываний, указывает адреса, в которых хранятся программы-диспетчеры, открывающий доступ к большим группам подпрограмм, обслуживающих конкретное прерывание.

Сигналы аппаратных прерываний, возникающие во внешних устройствах, поступают в МП через 2 контроллера прерываний. При этом по линиям данных подается номер вектора прерываний.

Самое начало ОП отводится под векторы прерываний. Всего 256 номеров: адреса от 00000hдо 003FFh.

 

 

Векторы прерываний делятся на группы:

- внутренние прерывания МП (от 00hдо 06h)

- аппаратные прерывания (от 08hдо 0Fhи от 70hдо 77h)

- программный BIOS обслуживания аппаратуры ПК (10h, 13hи другие)

- программы DOS (21h, 22hи другие)

- адреса системы таблиц BIOS (1Dh, 1Ehи другие)

 

Рассмотрим программные прерывания.

Общий вид:

INT {номер прерывания}

где {номер прерывания}может принимать значения от 0 до 255 и соответствует ситуации, обслуживаемой конкретным прерыванием.

Прерывания, вызываемые DOS называются прерываниями низкого уровня. Прерывания верхнего уровня используются в прикладных программах.

Примеры прерываний верхнего уровня:

Номер

Ситуация или выполняемые действия

10-чный 16-чный
32 20h Нормальное завершение программы
33 21h Обращение к функциям DOS
34 22h Вызов подпрограммы обработки завершения задачи

 

Особенно важно прерывание 21h, которое может выполнять множество функций DOS по обслуживанию стандартных устройств и файловой системы.

Например,

№ функции Операция
0 Завершение программы (аналог 20h)
1 Ввод символа с клавиатуры с эхом на экране
2 Вывод символа на экран
5 Вывод символа на печать
8 Ввод символа с клавиатуры без эха
9 Вывод строки символов на экран
3Fh Чтение из файла или ввод с устройства
40h Запись в файл или вывод на устройство
4Ch Завершение программы с возвратом управления
4Dh Выдача кода завершения программы

Номер функции заносится в AH до вызова прерывания.

Например,

MOVAH, {номер функции}

INT 21h

Кроме того, в другие регистры МП программа обработки должна поместить аргументы выполняемой операции, если они нужны, а по окончании обработки из регистров могут быть получены результаты операции.

Например, 3-хсегментная программа вывода строки на экран:

Text SEGMENT

Hello DB ‘Здравствуйте!$’

Text ends

Primer SEGMENT

ASSUME CS:Primer, DS:text, SS:stack

Start: MOV AX, Text

    MOVDS,AX

MOVAH, 9; функция вывода строки

MOVDX, OFFSETHello

INT 21h

MOVAH, 4Ch; выход из программы

INT 21h

Primer ENDS

Stak SEGMENT ‘stack’

    DW 128 dup(?)

Stak ENDS

ENDStart

Операторы в инструкциях ЯА.

 

Операторы позволяют уточнить (модифицировать) команды.

Они условно делятся на 2 группы:

­- операторы атрибута,

- операторы, возвращающие значение, т.е. определяющие его.

1) Операторы атрибута:

PTR – используется совместно с атрибутами типа Byte, Word, Dwordдля локальной отмены типов, определенных декларациями DB, DW, DD) или с атрибутами Nearили Far для отмены значения дистанции, принятого по умолчанию.

Например,

FdDW 322h

MOVAH, BytePTRFd+1; пересылка 2-го Байта, т.еAH:=03h

SHORT – модификация атрибута Nearв команде JMP

Например,

JMPShortL1

 

2) Операторы, возвращающие значение:

DUP – опрераторповторения начальных значений.

Например, MASSIV DW 100 DUP(0)

или A DB 2 DUP(12h, 44h)

 


12h 44h 12h

ОП
44h

4 Б
                                   

 

LENGTH – возвращает число элементов, определяемых оператором DUP.

Например,

Tabl DW 10 DUP(0)

MOV DX, LENGTH Tabl; dx:= 000Ah

Если DUP отсутствует, то возвращаемое значение 1.

OFFSET – возвращает относительный адрес переменной или метки; используется обычно в команде mov.

Заметим, что есть аналогичная инструкция ЯА:

LEAop1,op2

Где op1 – регистр для слова (2Б), op2 – идентификатор или другое описание адреса области ОП.

Например,

LEABX, Q;BX:=адрес Q

LEA SI, [BX+2]; SI:=[BX]+2

MovDX, Q;DX:= содержимое Q

 

SEG – возвращает адрес сегмента, в котором располагается данная переменная или метка; используется обычно в программах, состоящих из нескольких отдельно ассемблированных сегментов.

Например,

MOVDX, segFLDW;DX:= адрес сегмента данных

TYPE – возвращает число байтов, соответствующих типу переменных.

Например,

Определение Число байтов
DB 1
DW 2
DD 4

 

Например,

Tabl DW 10 DUP(0)

MOV AX, Type Tabl; AX:= 0002h

 

SIZE – возвращает произведение длины LENGTH и типа TYPE:

SIZE=LENGTH*TYPE(сколько байтов ушло на запись)

Пример:

MOV BX, Size Tabl; BX:= 0014h


 


Поделиться с друзьями:

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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.046 с.