"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу автора MOV CODE_SEG,CS ;создаем копию CS
MOV AX,ES ;копируем значение сегмента PSP MOV BX,ZSEG ;адрес сегмента конца программы SUB BX,AX ;вычисляем разность MOV AH,4AH ;номер функции SETBLOCK INT 21H ;освобождаем память JC SETBLK_ERR ;флаг переноса говорит об ошибке ;---отводим память для оверлея MOV BX,1000H ;отводим для оверлея 1000H байт MOV AH,48H ;функция отведения памяти INT 21H ;теперь AX:0 указывает на блок JC ALLOCATION_ERR ;флаг переноса говорит об ошибке MOV OVERLAY_SEG,AX ;запасаем адрес сегмента оверлея ;---вычисление смещения оверлея в кодовом сегменте MOV AX,CODE_SEG ;вычитаем значение сегмента оверлея MOV BX,OVERLAY_SEG ;из значения сегмента кода SUB BX,AX ;BX содержит число параграфов MOV CL,4 ;сдвигаем это число на 4 бита влево SHL BX,CL ;чтобы получить величину в байтах MOV OVERLAY_OFFSET,BX ;запоминаем смещение ;---загрузка первого оверлея MOV AX,SEG BLOCK ;ES:BX указывает на блок параметров MOV BX,OFFSET BLOCK MOV AX,OVERLAY_SEG ;помещаем адрес сегмента оверлея в MOV [BX],AX ;первое слово блока параметров MOV [BX]+2,AX ;сегмент оверлея - фактор привязки LEA DX,PATH ;DS:DX указывает на путь к файлу MOV AH,4BH ;номер функции EXEC MOV AL,3 ;код загрузки оверлея INT 21H ;загружаем оверлей JC LOAD_ERROR ;флаг переноса говорит об ошибке ;---теперь программа занимается своими делами . . CALL DWORD PTR OVERLAY_OFFSET ;вызов оверлея . ;нужно указывать DWORD PTR, так как оверлей - . ;далекая процедура ;---посмотрите эту структуру, когда будете писать оверлей DSEG SEGMENT ;как обычно, устанавливаем сегмент данных . ;опускаем стековый сегмент (используется . ;стек вызывающей программы) DSEG ENDS CSEG SEGMENT PARA PUBLIC 'CODE' |
|
|