2.5. Организация стека в Intel 8086 Стек – специальная область памяти, достуная для записи (заполнения) и выборки (выталкивания) данных только с одного конца, называемого верхушкой стека. В процессоре Intel 8086 на верхушку стека указывает РОН указатель стека (SP – stack pointer), стек может работать только со словами, заполнение стека происходит в сторону уменьшения адресов с помощью команды PUSH, а освобождение стека (выталкивание данных из стека) – в сторону увеличения адресов командой РОР.
По существу команда PUSH AX и POP AX, соответственно сохраняющая содержимое РОН AX в стеке и восстанавливающая содержимое РОН AX из стека, выполняется в два приема:
PUSH AX: POP AX:
(SP)-2SP [SP]AX
(AX)[SP] (SP)+2SP Использование стека:
промежуточное хранение содержимого регистра или группы регистров;
обмен содержимого регистров;
сохранение адресов возврата при вызове подпрограмм;
передача параметров между вызываемой и вызывающей программами;
сохранение адресов возврата и регистра флагов при обработке прерываний.
2.6. Распределение оперативной памяти в Intel 8086 для MS DOS Примерное распределение адресного пространства основной памяти, принятое в ОС MS DOS, приведено в табл. 2.1 Таблица 2.1
Границы участка, Кб
| Сегмент:смещение
| Назначение участка
| 0..1
| 0000:0000(03FF)
| 256 векторов прерываний
| 1..60
| 0010:0000
| Область данных и резидентная часть DOS
IO.SYS – расширитель BIOS:
настройка на конфигурацию системы;
установка новых драйверов;
исправление ошибок и неточностей BIOS применительно к данной системе
MSDOS.SYS – обработчик прерываний операционной системы:
прерывания DOS;
функция DOS (21h)
резидентная часть COMMAND.COM:
обработка командных файлов;
инициирование запуска остальных исполняемых файлов
| 60..640
|
| Данные, программы пользователя
| 640..768
| A000:0000
| Область видеоадаптеров
| 768..1016
| C000:0000
FE00:0000
| Область ПЗУ;
Область BIOS.
| 2.7. Организация выполняемых программ в MS DOS При работе в среде ОС MS DOS используется три типа исполняемых файлов:
*.bat – задают порядок выполнения некоторой последовательности программ;
*.com – файлы исполняемых программ типа com;
*.exe – файлы исполняемых программ типа exe.
Файлы типа *.com содержат только исполняемый код без дополнительной информации о программе, формируются в загрузочном виде и не требуют настройки. Весь код, данные и стек такой программы располагаются в одном сегменте, имеют длину не более 64 Кб и служат для организации простых модулей, ориентированных на модели памяти tiny и small (прил. 1).
Файлы типа *.exe могут иметь произвольную длину, они содержат заголовок, в котором описывается размер файла, требуемый объем памяти и таблица загрузки – список команд с абсолютными адресами, требующих настройки при загрузке в зависимости от размещения программы в памяти.
Структура размещения в памяти файла типа COM показана на рис. 2.4.
64 Кб
| Стек Данные и код программы
| SS:SP
|
|
|
|
100h CS:IP ( директива ORG 100h)
|
|
PSP
|
|
|
| 0
| DS, CS, ES, SS
| Рис. 2.4
В начальной части com-файла программы (а также и exe-файла) MS DOS размещает специальный блок – префикс сегмента программы (PSP-рrogram segment prefix), который содержит информацию для доступа программы к параметрам командной строки, к среде окружения, для реакции программы на критические ошибки и некоторые команды типа Ctrl+C. В начальной части PSP указан адрес обработчика прерываний для возврата в DOS. Так как после загрузки все сегментные регистры, включая CS, указывают на начало PSP, а IP = 0, то программа не может исполняться, начиная с этого адреса, и первой командой делают ORG 100h , устанавливающуую CS:IP на конец PSP.
Структура размещения в памяти файла типа EXE показана на рис. 2.5ю мых файлов. сразу за данной.., а состав основных полей ПСП – в табл. 2.2.
SS:SP
Стек
SS:00
Данные
DS (сюда его необходимо установить)
Код 100h CS:00
PSP
DS (начальное положение), ES Рис. 2.5 Состав основных полей префикса сегмента программы (PSP) показан в табл. 2.2.
Таблица 2.2
0h
| DW
| Команда INT 20 ( 16-ный код: CD 20) - вызов прерывания DOS для завершения программы и возврата в DOS
| 2h
| DW
| Размер доступной для программы памяти в параграфах
| 0Eh
| DD
| Адрес обработчика прерывания по Ctrl^Break (INT 23h)
| 12h
| DD
| Адрес обработчика прерывания по критической ошибке (INT 24h)
| 2Ch
| DW
| Значение сегментного адреса среды окружения
| 80h
| 64W
| DTA –буферная область данных / адрес начала командной строки программы
| |