Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие
.pdf
ES, DS
CS
SS
PSP
256 байт
Сегмент
кода
Сегмент
данных
Сегмент
стека
Образ программы в памяти начинается с префикса программного сегмента (Program Segment Prefix, PSP), образуемого и заполняемого системой. PSP всегда имеет размер 256 байт и содержит таблицы и поля, используемые системой в процессе выполнения программы. Вслед за PSP располагаются сегменты программы. Сегментные регистры при передаче управления программе автоматически инициализируются следующим образом: ES и
DS указывают на
начало PSP (что дает возможность использовать его содержимое),
CS – на начало сегмента кода, SS – на начало сегмента стека. В указатель команд IP загружается относительный адрес точки входа в
программу (из операнда директивы END), а в указатель вершины
стека SP – смещение конца сегмента стека. Таким образом, после
загрузки программы в память адресуемыми оказываются все
сегменты, кроме сегмента данных. Инициализация сегмента DS возложена на программиста. В программе выше это делается в первых
двух строках.
Как уже отмечалось, программа типа .COM отличается от .EXE
лишь тем, что содержит только один сегмент, включающий все компоненты: PSP, код, данные, стек. Структура типичной программы на
языке Ассемблера выглядит следующим образом:
CSEG SEGMENT
ASSUME ds:СSEG, cs:CSEG, ss:СSEG
Org 100H
beg:
; определение кода
…
71

int 20H ; конец программы
;определение данных
…
CSEG ENDS
END beg
В программе присутствует единственный сегмент CSEG. Директива Org 100H резервирует 256 байт под PSP. Заполнять его будет по-прежнему система, но программист должен отвести под него
место. Результатом применения этой директивы является то, что
транслятор будет рассчитывать смещения в сегменте с учетом этих
дополнительных 256 байт, но физически никакой
дополнительной
памяти при трансляции и компоновке не создается. Данные могут
располагаться в программе в любом месте. Следует только учитывать, что при загрузке в регистр IP помещается значение 100H. Таким образом, за директивой Org 100H должна первой следовать команда программы. Все сегментные регистры указывают на начало
PSP. Указатель стека автоматически инициализируется значением
0FFFEH.
Таким образом, независимо от размера программы, ей всегда выделяется 64 Кб. Образ программы типа .COM в памяти приведен на рисунке ниже.
CS,ES, DS,SS
PSP
256 байт
Код
данные
Данные
IP
Стек
SP=0FFFEH
В большинстве случаев программы для процессоров 80х86 состоят из нескольких сегментов, где каждый сегмент физически является частью кода или/и данных. Доступ к тому или иному сегменту
можно обеспечить, используя сегментные регистры. Основываясь на
этой схеме, можно получить несколько различных моделей организации программы. Таким образом, разработано несколько
стандартных моделей организации памяти. Поскольку многие из языков высокого уровня следуют этим соглашениям, язык Ассемблера также
придерживается их.
72

• TINY – все четыре сегментных регистра (CS, DS, ES, SS) ука-
зывают на один и тот же адрес, используются ближние указатели.
Всего на код и данные имеется 64 Кб памяти.
• SMALL – код и данные не перекрываются и расположены в
различных сегментах, т.е. как на код, так и на данные со стеком имеется по
64 Кб памяти. Используются ближние указатели.
• MEDIUM – код может быть расположен в нескольких сег-
ментах. Данные и стек находятся в одном сегменте. Для кода используются дальние указатели, для данных – ближние. Таким образом, под данные и стек отводится до 64 Кб, код может достигать размера до 1 Мб.
• COMPACT –
противоположна модели MEDIUM. Код располагается в одном сегменте, данные – в нескольких. Указатели на код –
ближние, на данные – дальние. Код ограничен по размеру 64 Кб,
данные могут занимать до 1 Мб.
• LARGE – как код, так и данные могут быть расположены в
нескольких сегментах и могут занимать до 1Мб памяти. Указатели
обоих типов дальние
.
• HUGE – как код, так и данные могут быть расположены в не-
скольких сегментах и занимать до 1Мб памяти. Указатели обоих типов дальние. Эта модель памяти, созданная для языков высокого
уровня, позволяет работать со структурами данных, имеющими размер более 64 Кб.
Префикс программного сегмента (PSP)
Префикс программного сегмента – это
структура размером 256
байт, создаваемая DOS при загрузке программы. Она размещается
непосредственно перед образом загруженного исполняемого модуля, и вместе они составляют область памяти, называемой программным сегментом. PSP содержит различную служебную информацию,
часть который описана в Таблице № 1.
Таблица № 1
Некоторые поля PSP
Смещение
(байт)
00H 2 Код команды int 21H – завершить работу
Размер
(байт)
Описание
73

02H 2 Адрес сегмента первого блока свободной памяти
20H 2 Сегментный адрес блока переменных окруже-
ния
80H 1 Длина строки параметров
81H 127 Параметры, указанные в командной строке при
запуске программы
Блок переменных окружения
Кроме программного сегмента, при запуске программы для нее
выделяется еще одна область памяти, в которой создается блок переменных окружения. Он содержит набор строк вида ПАРАМЕТР=ЗНАЧЕНИЕ, заканчивающихся двоичным нулем (ASCIIZстроки). Он завершается пустой строкой, состоящей из одного нулевого символа. За ней следует счетчик параметров
размером в слово
(два байта), передаваемых программе в командной строке. Парамет-
ры также являются ASCIIZ-строками. Первый из них всегда содержит имя загруженной программы с полным дисковым путем.
Окружение содержит, по крайней мере, строку COMSPEC=
СТРОКА, которая задает маршрут поиска командного интерпретатора COMMAND.COM. Также там обычно присутствуют значения,
заданные при помощи
команд PATH, PROMPT и SET.
Задания для выполнения
Задание № 1. При выполнении задания исходные данные долж-
ны передаваться программе через окружение. Имена переменных
окружения, содержащих нужную информацию, задаются как параметры командной строки. Предположим, что программе program.
exe нужно передать два числа. Для этого нужно создать две переменные окружения, например X и Y, имеющие
требуемые значения.
Это можно сделать при помощи следующих команд:
c:\>set x=10
c:\>set y=20
c:\>program.exe X Y
При этом надо учитывать, что порожденная задача наследует
окружение родительского процесса, но не наоборот. Поэтому, если
вы пользуетесь какой-либо оболочкой, например Norton Commander,
то из нее надо выйти или поместить все команды в пакетный файл,
74

так как для выполнения каждой команды она вызывает командный
интерпретатор, который затем выгружается. Все сделанные в окружении изменения исчезают.
Для каждого варианта задания необходимо подготовить две
версии программы: в формате COM и в формате EXE.
1. Задаются координаты вершин треугольника на плоскости.
Определить квадрат его площади. Для вычисления можно воспользоваться
формулой Герона.
2. Задаются координаты двух соседних сторон параллелограм-
ма на плоскости и значение синуса угла между ними в виде десятичной дроби. Вычислить квадрат его площади.
3. Программе передаются две строки. Одна из них может вхо-
дить в другую. Если это так, то определить начальную и конечную
позицию вхождения.
4.
Сделать программу-калькулятор. Она принимает три пара-
метра: X, Y и op, где X и Y – целые знаковые числа, а op – знак одной из арифметических операций: '+', '-', '*' и '/'. Вычислить значение
выражения X op Y.
5. Программе передается строка, содержащая набор чисел в
шестнадцатеричном формате. Отсортировать их в убывающем
порядке.
6. Программе передается строка, содержащая три пары
целых
чисел – координат вершин треугольника на плоскости. Определить
квадрат его площади.
7. Вычислить количество теплоты Q, выделяемое проводником
с сопротивлением R за время T при силе тока I (Q=I
Q, R и T передаются программе.
8. Вычислить значения функции f(x)=x
3+x2
сегменте [a, b]. Значения a и b определяются пользователем.
9. Вычислить значения интеграла функции f(x)=x
2
RT). Значения
+x+1 с шагом 1 на
3
на отрезке
[a, b]. Значения a и b задаются пользователем.
10. Задается десятичное число. Определить, четное ли количе-
ство битов равно 1 в его двоичном представлении.
11. Задается десятичное число. Определить, какого типа дан-
ных достаточно для его хранения: байта, слова или двойного слова.
12. Задается десятичное вещественное число, например
"123456.7899". Всего допускается до четырех
знаков после запятой.
Округлить его до ближайшего целого.
75

13. Задается десятичное число. Определить, делится ли оно без
остатка на 3.
14. Задается некоторое число в формате «дд.мм.гггг», напри-
мер "28.12.2000". Определить, на какой день недели оно приходится.
15. Программе передается полный путь к файлу на диске. Вы-
делить его составляющие: имя диска, каталог, имя и расширение
файла.
16.
Задается десятичное число. Определить его представление
в виде суммы различных степеней числа 2. Например, 11 = 2
3+21+20
.
17. Задается строка, содержащая дробь, которая может быть
неправильной, например: "100/37" или "50/607". Привести ее, если
это необходимо, к правильному виду.
18. Задается строка, содержащая дробь, которая может быть
неправильной, например: "101/1010" или "156/52". Сократить ее, если это возможно.
19. Задается некоторый момент времени в формате «чч:мм:сс»,
например, "22:46:17". Определить, сколько секунд
прошло до него с
начала суток.
20. Определить, какой путь пройдет точка за время T, если в
момент начала отсчета она двигалась со скоростью V
ствовало ускорение a. Значения T, V
и a передаются программе.
o
и на нее дей-
o
Контрольные вопросы
1. В чем состоит различие между программами, содержащимися в
исполняемом модуле типа EXE и типа COM?
2. Какой максимальный размер может занимать программа типа
COM при загрузке в память?
3. Какой максимальный размер может занимать программа типа
EXE при загрузке в память?
4. Какие различают по назначению
основные типы сегментов?
5. Какой максимальный размер имеет один сегмент?
6. Из скольких сегментов может состоять программа типа COM?
7. Из скольких сегментов может состоять программа типа EXE?
8. Опишите структуру образа исполняемого модуля типа EXE в
памяти.
9. Опишите структуру образа исполняемого модуля типа COM в
памяти.
76

10. Какие значения имеют регистры процессора при входе в про-
грамму типа EXE?
11. Какие значения имеют регистры процессора при входе в про-
грамму типа COM?
12. Каким образом программа типа EXE и программа типа COM по-
лучают доступ к сегменту данных?
13. Для чего предназначена директива ORG?
14. Какие модели памяти предусматривают несколько сегментов
кода
?
15. Какие модели памяти предусматривают несколько сегментов
данных?
16. Какие модели памяти предусматривают определение сегмента
стека?
17. Какие модели памяти предусматривают наличие только одного
сегмента кода?
18. Какие модели памяти предусматривают наличие только одного
сегмента данных?
19. В чем состоит особенность модели HUGE?
20. Что такое перемещаемые элементы в исполняемом модуле
типа
EXE?
ЛАБОРАТОРНАЯ РАБОТА № 8
УПРАВЛЕНИЕ ОПЕРАТИВНОЙ ПАМЯТЬЮ, ВВОД-ВЫВОД В
ФАЙЛЫ В ОДНОЗАДАЧНОЙ ОПЕРАЦИОННОЙ СИСТЕМЕ
MS-DOS
Цель: изучить методы распределения оперативной памяти и
способы ее использования, а также технику доступа к файлам в однозадачной системе MS-DOS.
Назначение: изучить способы предоставления, контроля над
использованием и доступа к обычной оперативной памяти
в MSDOS, освоить на практике методы организации данных в виде файлов.
Методы распределения памяти
DOS выделяет память блоками, связанными в список. Каждый
блок состоит из двух частей:
77

1 – блок управления памятью (MCB);
2 – блок данных.
Блок данных содержит коды или данные загруженной программы. Он начинается с границы параграфа и может иметь неограниченную длину (но не более всей доступной памяти для программ).
Длина блока кратна 16 байтам.
Блок управления памятью – это управляющий блок, который
DOS использует для распределения, модификации и
освобождения
блоков системной памяти.
MCB делятся на два типа:
1. Блоки M-типа: существует следующий блок, находящийся по
адресу (Сегмент блока + Размер блока + 1):0000.
2. Блоки Z-типа: блок последний в списке, т.е. (Сегмент блока +
Размер блока + 1):0000 = конец системной памяти.
Формат MCB приведен в таблице ниже.
Таблица № 1
Формат управляющего блока памяти MCB
Смещение Длина
Содержимое
+0 1 Тип
«M» – промежуточный MCB в цепочке
«Z» – последний MCB в цепочке
+1 2 Владелец (сегментный адрес PSP програм-
мы, владеющий блоком). Равен 0000h, если
не занят, 0008h, если принадлежит DOS.
+3 2 Объем блока в параграфах
+5 3 Зарезервировано
+8 8 Имя программы без расширения в формате
ASCII заканчивается 0, если меньше 8 сим-
волов. Блоки, которыми владеет DOS, имеют значения «SC» для системного кода или
для захваченной памяти между блоками
UMB, «SD» – для системных драйверов.
78

При загрузке программы для выполнения DOS выделяет для нее
два блока памяти. Первый отводится под переменные окружения.
Второй содержит сам образ исполняемого модуля и называется программным сегментом. Он всегда начинается с префикса программного сегмента PSP размером 256 байт, за которым сразу следует модуль. Поле имени программы заполнено только у тех MCB, которым
принадлежит программный сегмент. Для того чтобы узнать, кому
принадлежит блок переменных окружения, надо использовать поле
адреса программного сегмента владельца (адреса PSP).
Для того чтобы получить адрес первого в системе блока MCB,
нужно воспользоваться функцией 52h прерывания 21h, после вызова
которой пара ES:BX указывает на так называемый список списков
DOS. По смещению –2 (минус два) в нем находится
рес первого блока MCB.
Управляющий блок MCB всегда находится непосредственно
перед блоком памяти, который он описывает. Таким образом, если
известен адрес последнего, то получить адрес соответствующего
MCB можно, просто уменьшив его на 16 байт. Рисунок 1 иллюстрирует организацию памяти в MS-DOS.
сегментный ад-
MCB
Блок
памяти
MCB
Блок
памяти
MCB
Блок
памяти
…
Рис. 1. Распределение обычной памяти в MS-DOS
79

Интерфейс прикладных программ для доступа
к обычной оперативной памяти
Функция 48H, прерывание 21H: Выделить память
Назначение
Выделяет запрошенное количество параграфов памяти.
При вызове Содержимое регистров
AH 48H
BX Количество параграфов памяти
После
завершения
AX:0 Указатель на блок выделенной памяти
AX Код ошибки, если установлен флаг переноса
BX Размер наибольшего доступного блока памяти (в пара-
Содержимое регистров
графах), если выделение не выполнено
Комментарии
При вызове регистр BX должен содержать желаемый размер
памяти в параграфах. После выполнения функции регистр AX содержит сегментный адрес выделенного блока памяти. Если выделить блок указанной длины невозможно, в регистре BX возвращается размер максимального свободного блока в параграфах. Код
ошибки возвращается в регистре AX.
Функция 49H, прерывание 21H: Освободить выделенную
память
Назначение
Освобождает указанный блок выделенной памяти.
При вызове Содержимое регистров
AH 49H
ES Сегмент адреса освобождаемого блока
После
завершения
AX Код ошибки, если установлен флаг переноса
Содержимое регистров
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
