давно
Старший Модератор
31795
6196
12.11.2007, 17:55
общий
это ответ
Здравствуйте, Каликов Сергей Александрович!
По не резидентной части:
<font color=blue>mov ah,31h
LEA dx, init
int 21h</font>
Эта функия резервирует объем памяти указанный в параграфах.
<b>Параграф - 16-ти байтная область памяти</b>
При компиляции Вашей программы компилятор записывает число <b>012Bh</b>=299 т.е. резервируемая область памяти равна 4784(299*16) байта, при необходимых 299 байтах .
В Вашем случае выгодно использовать:
<font color=blue>LEA dx, init
int 27h</font>
вместо дополнительных вычислений:
<font color=blue>mov ah,31h
LEA dx, init
<b>shr dx,4
inc dx</b>
int 21h</font>
По резидентной части:
<font color=blue>a10:
cmp ah,9
jne exit
;сохраняем все используемые регистры
pusha
;на момент вызова обработчика достоверно известен только CS
;DS - не известен, по этому его и определяем DS=CS, для функции 3Ch
;т.к. для открытия(создания) имя файла должно указыватся парой DS:DX
push ds
push cs
pop ds
mov ah,3ch
mov cx,00
lea dx,fil;У Вас обработчик будет пытатся открыть файл с именем
;по адресу DS:DX=??:103h, а там может быть и код вместо имени
pushf;возврат будет по IRET-это 3-и байта(flag, CS:IP)
CALL DWORD PTR cs:[saveint9]
;закрываем открытый файл
;т.к. при повторном открытии (уже открытого файла)может появится ошибка
;выполнения функции, которая Вами не учитывается.
mov bx,ax
mov ah,3eh
pushf;
CALL DWORD PTR cs:[saveint9]
pop ds;востанавливаем все регистры
popa
;в принципе тут можно вернутся по IRET
;если не нужно выводить строку
exit:
jmp cs:[saveint9]</font>
Приблизительно так я бы написал такой обработчик.
ps: Для использования команд : pusha | pushf | popa | shr dx,4
поставте в начале программы директиву: <b>.186</b>- разрешить команды 186-го процессора
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.