Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 ЛР Ассемблер Архитектура ВС 6 семестр.doc
Скачиваний:
7
Добавлен:
03.05.2019
Размер:
454.66 Кб
Скачать

Исследование операций с памятью компьютера. Программирование на языка Assembler в операционной системе ms-dos. Обычная память

До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там имеется еще хотя бы 64 Кб свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти - выделение блока (аналог стандартной функции языка С inalloc), изменение его размеров (аналог realloc) и освобождение (free).

Функция DOS 48h: Выделить память

Вход: АН = 48h

ВХ = размер блока в 16-байтных параграфах

Выход: CF = 0, если блок выделен

АХ = сегментный адрес выделенного блока

CF = 1, если произошла ошибка:

АХ =7 - блоки управления памятью разрушены

АХ = 8 - недостаточно памяти:

ВХ = размер максимального доступного блока

Эта функция с большим значением в ВХ (обычно 0FFFFh используется для определения размера самого большого доступного блока памяти.

Функция DOS 49h: Освободить память

Вход: АН = 49h

ES = сегментный адрес освобождаемого блока

Выход: CF = 0, если блок освобожден

CF = 1, АХ = 7, если блоки управления памятью разрушены;

АХ = 9, если в ES содержится неверный адрес

Эта функция не позволит освободить блок памяти, которым текущая програм­ма не владеет, но с помощью функции DOS 50h (AX = 50h, ВХ = сегментный ад­рес PSP процесса) программа может «притвориться» любым другим процессом.

Функция DOS 4Ah: Изменить размер блока памяти

Вход: АН = 4Ah

ВХ = новый размер в 16-баитных параграфах

ES = сегментный адрес модифицируемого блока

Выход:CF = 1, если при выполнении операции произошла ошибка

АХ = 7, если блоки управления памятью разрушены

АХ = 8, если не хватает намят (при увеличении)

АХ = 9, если ES содержит неверный адрес

ВХ = максимальный размер, доступный для этого блока

Если для увеличения блока не хватило памяти, DOS расширяет его до возмож­ного предела.

При запуске СОМ-программы загрузчик DOS выделяет самый большой до­ступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделен­ный программе блок памяти до минимума перед загрузкой другой программы), но уже в MS DOS 5.0 и далее с помощью этих же функций можно выделять па­мять в областях UMB - неиспользуемых участках памяти выше 640 Кб н ниже 1 Мб, для чего требуется сначала подключить UMB к менеджеру памяти н изме­нить стратегию выделения памяти с помощью функции DOS 58h.

Область памяти НМА

Область памяти от 0FFFFh:0010h (конец первого мегабайта) до 0FFFFh:0FFFFh (конец адресного пространства в реальном режиме), 65520 байт, может исполь­зоваться на компьютерах, начиная с 80286. Доступ к этой области осуществля­ется с помощью спецификации XMS, причем вся она выделяется целиком од­ной программе. Обычно, если загружен драйвер HIMEM.SYS и если в файле CONFIG.SYS присутствует строка DOS = HIGH, DOS занимает эту область, осво­бождая почти 64 Кб в основной памяти. При этом ОС может оставить небольшой участок НМА (16 Кб или меньше) для пользовательских программ, которые обра­щаются к нему с помощью недокументированной функции мультиплексора 4Ah.

Следует помнить, что область НМА доступна для программ только в том случае, когда адресная линия процессора А20 разблокирована. Если DOS нe занимает НМА, она практически постоянно заблокирована на совмести­мость с программами, написанными для процессора 8086/8088, которые считают, что адреса 0FFFFh:0010h - 0FFFFh:0FFFFh всегда совпадают с 0000h :0000h - 0000h:0FFEFh. Функции XMS 01-07 позволяют управлять состоянием этой адресной линии.

Интерфейс ЕМS

Расширенная память (EMS) - дополнительная возможность для программ, за­пускающихся в реальном режиме (или в режиме V86), обращаться к памяти, ко­торая находится за пределами первого мегабайта. EMS позволяет отобразить сег­мент памяти, начинающийся обычно с 0D000h, на любые участки памяти, аналогично тому, как осуществляется доступ к видеопамяти в SVGA-режимах. Вызывать функции EMS (прерывание 67h) разрешается, только если в системе присутствует драйвер с именем ЕММХХХХ0. Для проверки его существования можно, например, вызвать функцию 3Dh (открыть файл или устройство). При­чем на тот случай, если драйвер EMS отсутствует, а в текущей директории есть файл с именем ЕММХХХХО, следует дополнительно вызвать функцию IOCTL -INT 21h с AX = 4400h и ВХ = идентификатор файла или устройства, полученный от функции 3Dh. Если значение бита 7 в DX после вызова этой функции равно 1, то драйвер EMS наверняка присутствует в системе.

Основные функции EMS:

Спецификация EMS была разработана для компьютеров IBM XT, снабжав­шихся особой платой, на которой и находилась расширенная память. С появле­нием процессора 80286 стало возможным устанавливать больше одного мегабай­та памяти на материнской плате, и для работы с ней была введена новая спецификация - XMS. Тогда же были созданы менеджеры памяти, эмулировав­шие EMS поверх XMS, для совместимости со старыми программами, причем ра­бота через EMS выполнялась медленнее. Позже, когда в процессорах Intel появил­ся механизм страничной адресации, выяснилось, что теперь уже EMS можно реализовать гораздо быстрее XMS. Большинство программ для DOS, которым требуется дополнительная память, поддерживают обе спецификации.

Интерфейс XMS

Спецификация доступа к дополнительной памяти (XMS) - еще один метод, позволяющий программам, запускающимся под управлением DOS в реальном ре­жиме (или в режиме V86), использовать память, расположенную выше границы первого мегабайта.

Способы адресации

Большинство команд процессора вызываются с аргументами, которые в ассем­блере принято называть операндами. Например: команда сложения содержимого регистра с числом требует задания двух операндов - содержимого регистра и чис­ла. Далее рассмотрены все существующие способы задания адреса хранения опе­рандов - способы адресации.

Регистровая адресация

Операнды могут располагаться в любых регистрах общего назначения и сегмент­ных регистрах. Для этого в тексте программы указывается название соответствующего регистра, например: команда, копирующая в регистр АХ содержимое регистра ВХ, записывается как

mov ax,bx

Непосредственная адресация

Некоторые команды (все арифметические, кроме деления) позволяют ука­зывать один из операндов непосредственно в тексте программы. Например:

команда

mov ах,2

помещает в регистр АХ число 2.

Прямая адресация

Если у операнда, располагающегося в памяти, известен адрес, то его можно использовать. Если операнд - слово, находящееся в сегменте, на который указы­вает ES, со смещением от начала сегмента 0001, то команда

mov ax,es:0001

поместит это слово в регистр АХ. В реальных программах для задания статичес­ких переменных обычно используют директивы определения данных, которые позволяют ссылаться на статические переменные не по адресу, а по име­ни. Тогда, если в сегменте, указанном в ES, была описана переменная word_var размером в слово, можно записать ту же команду как

mov ax,es:word_var

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

Адресация отличается для реального и защищенного режимов. В реальном (так же как и в режиме V86) смещение всегда 16-битное. Это значит, что ни не­посредственно указанное смещение, ни результат сложения содержимого разных регистров в более сложных методах адресации не могут превышать границ слова. При работе в Windows, DOS4G, PMODE и в других ситуациях, когда программа будет запускаться в защищенном режиме, смещение не должно превышать гра­ниц двойного слова.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]