Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
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.
Назначение: изучить способы предоставления, контроля над использованием и доступа к обычной оперативной памяти
в MS­DOS, освоить на практике методы организации данных в виде фай­лов.
Методы распределения памяти
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]