- •354000 «Прикладная информатика»
- •Idiv Деление целых знаковых чисел
- •Imul Умножение целых знаковых чисел
- •In Ввод из порта
- •Inc Инкремент (увеличение на 1)
- •Int Программное прерывание
- •I into Прерывание по переполнению
- •Iret Возврат из программы обработки прерывания
- •Xchg Обмен данными между операндами
- •Xlat Табличная трансляция
- •Xor Логическое исключающее или
- •Загрузка и выполнение программ
- •Составление программы на языке Assembler и её размещение в памяти компьютера. Стандартное распределение памяти под программные сегменты.
- •Оператор Текст
- •Имя Операнд_1 ;
- •Имя Операнд_1
- •Загрузка и выполнение программ
- •Mov dl,10 ;Позиция X
- •In Считать данные из порта.
- •Исследование команд, выполняемых процессором. Программирование операций с помощью отладчика языка Assembler..
- •Исследование операций с памятью компьютера. Программирование на языка Assembler в операционной системе ms-dos. Обычная память
- •Косвенная адресация
- •Адресация по базе со сдвигом
- •Косвенная адресация с масштабированием
- •Адресация по базе с индексированием
- •Программирование прерываний на языке Assembler в операционной системе ms-dos.
- •Исследование механизмов работа с видеопамятью персонального компьютера типа ibm. Тестирование и отладка ассемблерных программ.
Загрузка и выполнение программ
Как к любая операционная система, DOS загружает и выполняет программы. При загрузке программы в начале отводимого для нее блока памяти (для СОМ- программ это вся свободная на данный момент память) создается структура данных PSP (префикс программного сегмента) размером 256 байт (100h). Затем DOS создает копню текущего окружения для загружаемой программы, помещает полный путь и имя программы в конец окружения, заполняет поля PSP следующим образом:
+00h: слово - 0CDh 20h - команда INT 201i. Если СОМ-программа завершается командой RETN, управление передается на эту команду. Введено для совместимости с командой СР/М CALL 0
+02h: слово. - сегментный адрес первого байта после области памяти, выделенной для программы
+04h: байт - не используется DOS
+05h: 5 байт - 9Ah 0F0h 0FEh 01Dh 0F0h - команда CALL FAR на абсолютный адрес 000C0h, записанная так, чтобы второй и третий байты составляли слово, равное размеру первого сегмента для СОМ - файлов ( здесь 0FEF0h). Введено для совместимости с командой СР/М CALL 5
+0Ah:4 байта - адрес обработчика INT 22h (выход из программы)
+0Eh:4 байта - адрес обработчика INT 23h (обработчик нажатия Ctrl-Break)
+12h: 4 байта - адрес обработчика INT 24h (обработчик критических ошибок)
+16h: слово - сегментный адрес PSP процесса, из которого был запущен текущий
+18h: 20 байт -JFT - список открытых идентификаторов, один байт на идентификатор, 0FFh - конец списка
+2Ch: слово - сегментный адрес копни окружения для процесса
+2Eh:2 слова - SS:SP процесса при последнем вызове INT 21h
+32h: слово - число элементов JFT (по умолчанию 20)
+34h: 4 байта - дальний адрес JFT (по умолчанию PSP:0018)
+38h: 4 байта - дальний адрес предыдущего PSP
+3Ch: байт - флаг, указывающий, что консоль находится в состоянии ввода 2-байтного символа
+3Dh: байт - флаг, устанавливаемый функцией ОВ71 Hi прерывания 2Fli (при следующем вызове INT 21h для работы с файлом имя файла будет заменено полным)
+3Fh: слово - не используется в DOS
+40h: слово - версия DOS, которую вернет функция DOS 30h (DOS 5.0+)
+42h: 12 байт - не используется в DOS
+50h: 2 байта - 0CDh 21h - команда INT 21h
+52hi: байт - 0CBh - команда RETF
+53h: 2 байта - не используется в DOS
+55h: 7 байт - область для расширения первого FCB
+5Ch:16 байт - первый FCB, заполняемый из первого аргумента командной строки
+6Ch: 16 байт - второй FCB, заполняемый из второго аргумента командной строки
+7Ch: 4 байта - не используется в DOS
+80h: 128 байт - командная строка и область DTA но умолчанию
и записывает программу в память, начиная с адреса PSP:0100h. Если загружается ЕХЕ-программа, использующая дальние процедуры или сегменты данных, DOS модифицирует эти команды так, чтобы используемые в них сегментные адреса соответствовали сегментным адресам, которые получили указанные процедуры и сегменты данных при загрузке программы в намять. Во время запуска СОМ-программы регистры устанавливаются следующим образом:
AL = 0FFh, если первый параметр командной строки содержит неправильное имя диска (например, z:\soinething), иначе - 00h
АН = 0FFh, если второй параметр содержит неправильное имя диска, иначе - 00h
CS = DS = ES = SS = сегментный адрес PSP SP = адрес последнего слова в сегменте (обычно 0FFFE1); меньше, если не хватает памяти)
При запуске ЕХЕ-программы регистры SS:SP устанавливаются в соответствии с сегментом стека, определенным в программе, затем в стек помещается слово 0000h и выполняется переход на начало программы (PSP:0100h для СОМ, собственная точка входа для ЕХЕ).
Все эти действия выполняет одна функция DOS - загрузить и выполнить программу.
Функция DOS 4Bh: Загрузить и выполнить программу
Вход: АН = 4Bh
AL = 00h - загрузить и выполнить
AL = 0lh - загрузить и нe выполнять
DS:DX - адрес ASClZ-строки с полным именем программы
ES:BX - адрес блока параметров ЕРВ:
+00h: слово - сегментный адрес окружения, которое будет скопировано для нового процесса (или 0, если используется текущее окружение)
+02h: 4 байта - адрес командной строки для нового процесса
+06h: 4 байта - адрес первого FCB для нового процесса
+0Ah:4 байта -адрес второго FCB для нового процесса
+0Eh: 4 байта - здесь будет записан SS:SP нового процесса после его завершения (только для AL = 01)
+12h: 4 байта - здесь будет записан CS:IP (точка входа) нового процесса после его завершения (только для AL=01)
AL = 03h - загрузить как оверлей
DS:DX - адрес ASCIZ-строкк с полным именем программы
ES:BX - адрес блока параметров:
+00h: слово - сегментный адрес для загрузки оверлея
+02h: слово - число, которое будет использовано в командах, применяющих непосредственные сегментные адреса, -обычно то же самое, что и в предыдущем поле. 0 для СОМ-файлов
AL = 05h - подготовиться к выполнению (DOS 5.0+)
DS:DX - адрес следующей структуры
+00h: слово - 00h
+02h: слово - бит 0 - программа – ЕХЕ
бит 1 - программа – оверлей
+04h: 4 байта - адрес ASCIZ-строки с именем новой программы
+08h: слово - сегментный адрес PSP новой программы
+0Ah: 4 байта - точка входа новой программы
+0Eh: 4 байта - размер программы, включая PSP
Выход:
СЕ = 0, если операция выполнена, ВХ и DX модифицируются,
СЕ = 1, если произошла ошибка, АХ = код ошибки (2 - файл не найден, 5 - доступ к файлу запрещен, 8 - не хватает памяти. 0Ah - неправильное окружение, 0Bh - неправильный формат)
Подфункциям 00 и 01 требуется, чтобы свободная память для загрузки программы была в нужном количестве, так что СОМ-программы должны воспользоваться функцией DOS 4Ah с целью уменьшения отведенного им блока памяти до минимально необходимого. При вызове подфункции 03 DOS загружает оверлей в память, выделенную текущим процессом, поэтому ЕХЕ-программы должны убедиться, что ее достаточно.
Эта функция игнорирует расширение файла и различает ЕХЕ- и СОМ-файлы, но первым двум байтам заголовка (MZ для ЕХЕ-файлов).
Подфункция 05 должна вызываться после загрузки и перед передачей управления на программу, причем никакие прерывания DOS и BIOS нельзя вызывать после возвращения из этой подфункции и до перехода на точку входа повои программы.
Загруженной и вызванной таким образом программе предоставляется несколько способов завершения работы. Способ, который чаще всего применяется для СОМ-файлов, - команда RETN. При этом управление передается па адрес PSP:0000, где располагается код команды INT 20h. Соответственно программу можно завершить сразу, вызвав INT 20h, но оба эти способа требуют, чтобы CS содержал сегментный адрес PSP текущего процесса. Кроме того, они не позволяют вернуть код возврата, который может передать предыдущему процессу информацию о том, как завершилась запущенная программа. Рекомендованный способ завершения программы - функция DOS 4Ch.
Функция DOS 4Ch: Завершить программу
Вход: АН = 4Сh
AL = код возврата
Значение кода возврата можно использовать в пакетных файлах DOS как переменную ERRORLEVEL и определять из программы с помощью функции DOS 4Dh.
Функция DOS 4Dh: Определить код возврата последнего завершившегося процесса
Вход: АН = 4Dh
Выход: АН = способ завершения:
00h - нормальный
01h - Ctrl-Break
02h - критическая ошибка
03h - программа осталась в памяти как резидентная
AL = код возврата
CF=0
Воспользуемся функциями 4Ah и 4Bh в следующем примере программы, которая ведет себя как командный интерпретатор, хотя на самом деле единственная команда, которую она обрабатывает, - команда exit. Все остальные команды передаются настоящему COMMAND.СОМ с ключом /С (выполнить команду и вернуться).
Лабораторная работа №1