Консультация № 35769
20.02.2006, 02:18
0.00 руб.
0 2 1
Здраствуйте уважаемые эксперты.
1. Мне нужно создать резидентныйобработчик прерываний, который
будет перехватывать прерывание09h, создавать текстовый файл
и записывать в этот файл последний символ из буфера клавиатуры.
Программа ассемблируется илинкуется, при работе она
перехватывает прерывания и даже сосдает файл. Но файл без
расширения и символы не заносятся.
Текст программы привожу ниже.
2.Чем отличаются int20h, ret, ah,4Ch int 21h ?

Приложение:
.286CSEG segmentassume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEGorg 100hStart:jmp Initz ;на иницализациюInt_21h_proc proccmp ax,8899hjne Go_nextxchg ah,aliretGo_next:jmp dword ptr cs:[Int_21h_vect]Int_21h_vect dd ?Int_21h_proc endpInt_09h_proc procclipushfpushapush es xor ax,axmov ah,4Eh ;ищем файлxor cx,cx ;это файл для чтенияmov dx,offset myfile ;маска поискаint 21hjnc Enter_key ;если файл найден на Enter_keymov ax,3C00h ;если файл не найден создаём егоmov dx,offset myfile ;int 21h ;Enter_key:mov ax,3D01h ;открываем файлint 21h ;для записиpush ds ;сохраним dspush axxor ax,ax ;mov ax,word ptr 0000h:[041Ah] ;считываем из буфера клавиатурыmov ds,ax ;адрес последнего символаxor ax,ax ;сегментmov dx,word ptr 0000h:[041Ch] ;смещениеpop axmov cx,1 ;будем писать 1 байтmov bx,ax ;помещаем идентификатор в bxmov ah,40h ;пишемint 21h ;pop dsmov ah,3Eh ;закрываем файлint 21hpop es ;popapopfstijmp dword ptr cs:[Int_09h_vect]Int_09h_vect dd ?myfile db ‘c:\\tasm\\bin\\libfile.txt‘,0Int_09h_proc endp;=============Initz==============Initz:mov ax,8899h ;проверка на загрузку в памятьint 21h ;cmp ax,9988h ;jne Set_resit ;естли уже загружен обратноret ;Set_resit:mov ax,3521hint 21hmov word ptr Int_21h_vect,bxmov word ptr Int_21h_vect+2,esmov ax,2521hmov dx,offset Int_21h_procint 21hmov ax,3509h ;int 21h ;то-же, толькоmov word ptr Int_09h_vect,bx ;для прерывания 09hmov word ptr Int_09h_vect+2,es ;mov ax,2509h ;mov dx,offset Int_09h_proc ;передаем управлениеint 21h ;mov dx,offset Initz ;оставляем нашу программуint 27h ;резидентной в памятиCSEG endsend Start

Обсуждение

в сети
Советник
419
1011
20.02.2006, 08:34
общий
это ответ
Здравствуйте, Gogenot!
Во первых, ты портишь флаги, нужно вот так:
<ul>
Int_21h_proc proc
<b>pushf</b>
cmp ax,8899h
jne Go_next

xchg ah,al
<b>popf</b>
iret
Go_next:
<b>popf</b>
jmp dword ptr cs:[Int_21h_vect]
</ul>

В обработчике 9 прерывания не устанавливаешь правильный DS:

<ul>
Int_09h_proc proc
cli
pushf
pusha
push es

<b>push cs
pop ds</b>
</ul>

Здесь тоже глупости у тебя. Вот так нужно:
<ul>
push ds ;сохраним ds
push ax
<b>mov ax,40h
mov ds, ax</b>
mov bx,word ptr 0000h:[01Ah] ;считываем из буфера клавиатуры
;адрес последнего символа
mov dx, [bx]
pop ax
</ul>

удачи.
в сети
Советник
419
1011
25.02.2006, 18:21
общий
Prison, который раз замечаю, что ты не читаешь совершенно ни вопросов, ни исходников. Последний раз. В следующий раз будет официальное предупреждение.(не пиши мне личных писем. отвечаю сразу - здесь программа резидентная и она остаётся в памяти по команде mov dx,offset Initz ;оставляем нашу программуint 27h ;резидентной в памятиНо вот что забавно, ни тот, кто задавал вопрос, ни даже ты, ЭКСПЕРТ не увидели не то что код! но и комментариев, которые, смею заметить, на русском языке. И даже тот, кто совершенно не знает Ассемблер и программирование для ДОС, тот наверное и то бы догадался, что это такое).
Форма ответа