
- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Префикс сегмента программы (psp)
(program segment prefix)
PSP – это область размером 100h (25610), которая содержит информацию, необходимую DOS для обеспечения работы программы. Для СОМ-программы сегментные регистры (CS, DS и ES) указывают на начало PSP, а программа размещается сразу вслед за PSP, то есть со смещением 100h от начала PSP.
Структура префикса программного сегмента.
Поле |
Смещение от начала PSP |
Размер поля (десятичн) |
Значение |
1 |
0h |
2 байт |
Команда INT 20h |
2 |
2h |
2 байт |
Размер памяти в параграфах |
3 |
4h |
1 байт |
Резерв, обычно 0 |
4 |
5h |
5 байт |
Вызов диспетчера функций DOS |
5 |
Ah |
4 байт |
Вектор завершения работы (Адрес завершения CS:IP) |
6 |
Eh |
4 байт |
Вектор прерывания работы (Адрес выхода Ctrl-Break) |
7 |
12h |
4 байт |
Вектор ошибки (Адрес выхода по ошибке) |
8 |
16h |
22 байт |
Используется DOS |
9 |
2Ch |
2 байт |
Указатель строки связи с окружающей средой |
10 |
2Eh |
34 байт |
Рабочая область DOS |
11 |
50h |
3 байт |
Коменды INT 21h, RETF |
12 |
53h |
2 байт |
Зарезервировано |
13 |
55h |
7 байт |
Расширение FCB #1 |
14 |
5Ch |
9б айт |
FCB #1 |
15 |
65h |
7 байт |
Расширение FCB #2 |
16 |
6Ch |
20 байт |
FCB #2 |
17 |
80h |
1 байт |
Длина параметров |
18 |
81h |
127 байт |
Параметры |
19 |
80h |
128 байт |
Область передачи информации |
Поле 1 содержит байты CD20, то есть команду INT 20h.
Прерывание INT 20h используется для завершения программы и передачи управления DOS. Прерывание INT 20h эквивалентно AH=0 (функции 0) INT 21h. INT 20h не закрывает все открытые этой программой файлы.
Более совершенная функция выхода из программы 4Сh - завершает работу программы и передает тому, кто ее вызвал, код возврата. Если программа была вызвана как подпрограмма, то вызвавшая ее программа может получить код возврата с помощью функции 41h. Если программа вызывалась командой DOS, то код возврата может быть проверен в командном файле с помощью команды ERRORLEVEL. Код возврата возвращается в AL/ При выполнении этой функции DOS автоматически закрывает все файлы, открытые с помощью 3Dh и, возможно, 3Сh.
Итак, команда INT 20h находится в начале PSP . Таким образом, можно выйти из программы, просто передав управление на эту ячейку (при условии, что CS указывает на PSP).
Размещение в начале PSP команды INT 20h может быть объяснено тем, что если LINK обнаруживает в программе неудовлетворенную внешнюю ссылку, то он присваивает ее адресу смещения 0. при передаче управления на эту ссылку выполнится команда, находящаяся в начале PSP, то есть INT 20h, - что вызовет завершение программы.
Поле 2 – сколько памяти доступно – содержит номер последнего блока памяти, доступной DOS. Умножив это число на 16, получим общий объем памяти в байтах. То же самое значение, что и в поле 2, возвращает команда CHKDSK DOS. Если программе необходима вся доступная память, то она должна использовать это поле PSP для определения того, сколько памяти она может использовать.
Программа также может получать и возвращать память с помощью вызова функции 4Аh.
Поле 4. Это команда вызова с аттрибутом дистанции FAR диспетчера функций DOS. Следовательно, эта команда содержит полный адрес диспетчера. Этот полный адрес не только указывает на диспетчера, но при этом его смещение указывает, сколько памяти в сегменте команд мы можем использовать (до FFF0, то есть на 16 байт меньше, чем 64 КБайт). Это смещение расположено в PSP со смещением 6, сразу за кодом команды, имеющим смещение 5.
Это поле, в отдличие от предыдущего, должно работать с большинством многооконных и мультипрограммных систем. Если DOS может предоставить более 64 Кбайт, то определить, на сколько больше, мы можем по полю 2.
Поля 5, 6 и 7.
Это полные адреса, для трех прерываний по завершению работы, по Ctrl-Break (Ctrl-C) и по ошибке. Если мы хотим использовать свои программы для обработки этих ситуаций, то должны временно изменить эти слова. В конце работы вектора должны быть восстановлены.
Поле 9.
Полный адрес набора строк описания окружающей среды. это набор ASCIIZ строк. каждая строка имеет форму
ИМЯ = значение
Обычно эта среда содержит по крайней мере имя СОМSPEC (используемое DOS для поиска на диске файла COMMAND.COM).
Поле 11.
Содержит команды INT 21H и команду возврата управления вызвавшей программе RETF (так как RET с дальним аттрибутом дистанции FAR).
Таким образом, вместо INT 21h мы можем косвенно через смещение в PSP вызвать эту команду.
Поля 13, 14, 15 и 16.
FCB (File Control Block)
Устаревший способ работы с файлами.
Поля 17, 18.
Обеспечивают нашим программа доступ к параметрам командной строки. Поле 17 содержит полную длину строки параметров (которая может быть от 0 до 127), а поле 18 – ее содержимое.
Передаваемая строка не содержит имя вызванной программы. Строка начинается с символа, следующего в команде вызова сразу за именем программы; обычно это пробел. Разделители, пробелы и запятые не отбрасываются и не снимаются. Любые параметры переадресации ввода/вывода (такие как < - ввод и > - вывод) изымаются DOS и строка реконструируется таким образом, как будто этих элементов не было вообще. В результате этих двух операций программа не может узнать о переадресации стандартного ввода-вывода и не может узнать свое собственное имя.
Поле 19.
Это область, которая по умолчанию используется DOS для обмена данными с диском (DTA – Disk Transfer Area). Это буфер длиной 128 байт, имеющий смещение 80h. Используется всегда, когда мы пользуемся служебной процедурой DOS для обмена с диском, не задавая в качестве буфера свою собственную область.