Программы с несколькими сегментами команд. 


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



ЗНАЕТЕ ЛИ ВЫ?

Программы с несколькими сегментами команд.



 

Рассмотрим программы с расширением ЕХЕ. Любая программа, загружаемая в память, включает три компонента:

- окружение ENVIRONMENT

- префикс программы PSP

- собственно программу, в случае ЕХЕ может состоять из нескольких сегментов.

Поскольку окружение и сама прграмма (включая РSР) рассматриваются DOS,как отдельные блоки памяти, и та, и другая структура предворяются блоками управления памяти. МСВ-, размером 16 байт. С помощью этих блоков DOS ведёт учёт свободной и занятой памяти.

 

DS:[2ch], ES:[2Ch]

MCB
Окружение
 
DS,ES
MCB

CS
PSP

программа
 

 

CS,SS,IP и SP инициализируются заголовками из ЕХЕ-файла.

Рассмотрим ….СОМ программы. В этом случае единственный сегмент содержит все компоненты программы.

-PSP

-коды команд

-данные

-стек

В терминах языков высокого уровня это соответствует минимальной или крошечной модели памяти. Преимущество.СОМ прогр. перед ЕХЕ- компакность. Как правило резидентная программа пишется в формате.СОМ.

 
 
IP = 0100h


PSP
Программа с данными
SP = 0FFFEh
стек

 

Формат MCB блока

смещение длина Содержимое
    Тип ‘M’ (2DH) – за этим блоком есть еще блоки MCB Тип ‘Z’ (5AH) – данный блок последний
    Владелец (сегм. Адрес)
    Размер (число параграфов в памяти)
    Зарезервировано

Если команда помещается в один сегмент команд и данные в одном сегменте данных, то такая.ЕХЕ программа принадлежит к малой модели памяти. Если требуется увеличить объём команд, то необходимо организовать несколько сегментов команд. Программа с несколькими сегментами команд и одним сегментом данных относится к средней модели памяти. В программе, содержащей несколько сегментов команд, должны быть команды либо перехода из одного сегмента в другой, либо вызов процедуры из другого сегмента. Любое обращение к другому сегменту команд носит название межсегментного или дальнего.

Рассмотрим пример программы с двумя сегментами команд. Пусть основная программа в одном сегменте, а процедура-подпрограмма в другом.

 

text1 segment ‘code’

assume CS:text1, DS:data

main proc

mov AX,data

mov DS,AX

.

.

call far ptr subr1

.

.

call far ptr subr2

.

.

main endp

text ends

text2 segment ‘code’

assume CS:text2, DS:data

subr1 proc far

.

.

subr1 endp

;

subr2 proc far

.

.

subr2 endp

text2 ends

;

data segment

… DB

…DW

.

.

data ends

stack segment stack ‘stack’

DW 128 dup(0)

stack ends

end main

 

Сегмент команд с главной процедурой получил название text1. Процедуры subr1 и subr2 объявлены с описанием far, а её вызовы в главной процедуре сопровождаются описаниями far ptr (far pointer- дальний указатель). Вызов не call, а call far ptr.

 

Смещение код команды адрес проц. subr1

000A 9A 0009 4451 call far ptr subr1

1)CS=444D->в стек

2)IP=000F->в стек

код операции дальнего 3)4451-> в CS

вызова 4)0009-> в IP

 

ret- работает в зависимости от того, как объявлена процедура

ret-в дальней проц. снимает со стека два слова.

ret-в ближней процедуре снимает со стека одно слово.

 

Т.о. ближние процедуры следует вызывать только из того же сегмента командой ближнего вызова call, в то время, как процедуры, объявленные, как дальние следует вызывать только с помощью команды дальнего вызова call far ptr. Лишь в этом случае завершающие эти процедуры команды ret будут работать правильно.

 



Поделиться:


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

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