Консультация № 108890
11.11.2007, 04:33
0.00 руб.
0 1 1
Написал резидент который создает файл при обращении к 21h (вывод строки на экран) прерыванию и что-то он не работает подскажите в чем дело. И почему при востановлении из стека регистров CX и AX на метке B12 значение регистра CX пропадает и данные (09h) предназначенные для регистра AX попадают в CX.
Да, в одной из ваших рассылок видел, чтобы программу оставить резидентно необходимо вополнить 27h прерывание. Какой вариант лучше? Буду благодарен если пришлете правильный код программы, а то мучаюсь уже который день. Спасибо.

Приложение:
cseg segment assume cs:cseg, ds:cseg, ss:csegorg 100hstart:jmp initfil db "c:1.txt",0saveint9 dd ? a10:push axpush cxcmp ah,9jne exitmov ah,3chmov cx,00lea dx,filCALL DWORD PTR cs:[saveint9]exit:pop cx pop axjmp cs:[saveint9]init:mov ax,3521hint 21hmov word ptr saveint9,bxmov word ptr saveint9+2,esmov ax,2521hLEA dx, a10 int 21hmov ah,31hLEA dx, initint 21hcseg endsend start

Обсуждение

давно
Старший Модератор
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-го процессора
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа