Здравствуйте, gep, Вы писали:
gep>Вот прога:
gep> .186
gep>
это даже не под 286?
gep>IRQ_h proc far
gep> pusha
gep> mov dx, COM+2
gep> in al, dx
gep>IRQ_1: and ax, 0110b
gep>
ah неопределен
gep> inc cl
gep>
cl неопределен
gep> cmp ax, 0100b
gep>
ax неопределен
gep> jne IRQ_2
gep> mov dx, COM
gep> in al, dx
gep>; mov recv_b, al
gep>
;ds непоределен или писать по cs
gep>IRQ_2: mov dx, COM+2
gep> in al, dx
gep> test al, 1
gep> jz IRQ_1
gep>
не понял, это по чему цикл?
gep> mov al, 20h
gep> out 20h, al
gep> popa
gep> mov cl, 0FFh
gep>
портим cl
gep> iret
gep>recv_b db 0FFh
gep>IRQ_h endp
gep> ;инициализация
gep>init proc near
gep> call ie_des ;запрет прерываний СОМ
gep> ;прерывание СОМ порта на себя
gep> mov ah, 25h
gep> mov al, IRQ
gep> push cs
gep> pop ds
gep> mov dx, offset IRQ_h
gep> int 21h
gep> ;разрешим прерывание IRQ5
gep> in al, 21h
gep> and al, 11011111b ;IRQ5
gep> out 21h, al
gep> call ini_com ;настройка СОМ порта
gep> mov ax, 0B800h
gep> mov es, ax
gep> mov cl, 0
gep>
обмен с обработчиком прерываний надо делать через память а не через регистры
gep>mainl: xor ax, ax
gep> xor di, di
gep> mov al, cl
gep> push ax
gep> and ax, 0Fh
gep> mov bx, offset htable
gep> xlatb
gep> mov es:[di], al
gep> inc di
gep> inc di
gep> pop ax
gep> shr ax, 4
gep> xlatb
gep> mov es:[di], al
gep> jmp mainl
gep>exit: ret
gep>htable db "0123456789ABCDEF"
gep>COM = 02E8h ;адрес СОМ4
gep>IRQ = 0Dh ;прерывание СОМ4 IRQ5-INT(переставил вручную, для того чтобы
gep> ;попасть в первый контроллер перываний)
gep>init endp
gep> end start
gep>
gep>После запуска ведет себя следующим образом. Как только разрешаються прерывания в контроллере прерываний происходит одно прерывание. Еще до того как начинаеться цикл mainl. И все — хотя в порт данные точно поступают и другие программы их могут ловить.