"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу автораhandler), в которой доступ к файлу предоставляется по кодовому
номеру, а не через FCB (также обсуждается в [5.3.5]). Наконец, Вы должны построить строку с указанием накопителя, пути и имени файла. Эта строка именует загружаемую программу. DS:DX указывает на эту строку при выполнении EXEC. Эта строка - стандартная строка ASCIIZ, т.е. ничего более, чем стандартная спецификация файла, завершаемая кодом 0. Например, этоможет быть B:\NEWDATA\FILER.EXE После того как вся указанная информация подготовлена, остается последняя задача. Поскольку все регистры будут изменены вызывае- мой задачей, то надо сохранить сегмент стека и указатель стека, с тем чтобы они могли быть восстановлены, когда управление будет возвращено вызвавшей задаче. Для их сохранения создайте перемен- ные. Поскольку значение регистра DS также будет изменено, то эти переменные не могут быть найдены, до тех пор пока не будут повто- рены операторы MOV AX,DSEG и MOV DS,AX. После того как SS и SP сохранены, поместите 0 в AL, для выбора операции "загрузка и запуск" (EXEC используется также для оверлеев [1.3.5]). Затем поместите 4BH в AH и вызовите прерывание 21H. В этот момент запу- щены две программы, причем программа "родитель" находится в оста- новленном состоянии. MS DOS предоставляет возможность программе потомку передать родителю код возврата, таким образом могут быть переданы ошибки и статус. В [7.2.5] объяснено как это сделать. Что касается самой функции запуска, то при возникновении ошибки устанавливается флаг переноса, а регистр AX в этом случае будет 1 - неправильный номер функции, 2 - если файл не найден, 5 - при дисковой ошибке, 8 - при нехватке памяти, 10 - если неправильна строка среды, 11 - если неверен формат. Приводимый пример - простейший из возможных, но часто больше ничего и не надо. Здесь оставлен нулевым блок параметров и не создана строка среды. Это означает, что загружаемой программе не будет передаваться командная строка и что среда будет такой же, как и для вызывающей программы. Вы должны только изменить распре- деление памяти, создать имя и (пустой) блок параметров и сохра- нить значения SS и SP. ;---в сегменте данных FILENAME DB 'A:TRIAL.EXE',0 ;загружаем TRIAL.EXE PARAMETERS DW 7DUP(0) ;нулевой блок параметров KEEP_SS DW 0 ;переменная для SS KEEP_SP DW 0 ;переменная для SP ;---перераспределение памяти MOV BX,ZSEG ;получить # параграфа конца MOV AX,ES ;получить # параграфа начала |
|
|