Консультация № 155133
20.12.2008, 20:42
50.00 руб.
0 0 0
Добрый день!
Уважаемые эксперты, помоги доработать программу..
задание такое: сделать резидентную программу выводящую на экран текущее состояние клавиш ctrl, shift, caps lock, num lock, scroll lock, insert, alt.. выводить на ctrl + s, выгружать из памяти на ctrl + x
я практически сделал работу, хотел выводить сообщение после проверки... надо обязательно прерыванеи bios...но неполучается..
подскажите как можно вывести сообщение (строчку) с прерыванием bios, и вообще правильно ли я делаю проверку и выВожу на экран сообщения???
Заранее спасибо.

Приложение:
.286
CSEG SEGMENT
ASSUME CS:CSEG, DS:CSEG, SS:CSEG
org 100h
start:
jmp init
;************************************************
oldint9 dd ?
apage db ?
kursor dw ?
Ctrl db 'Ctrl',0Dh,0Ah
Alt db 'Alt',0Dh,0Ah
ShiftL db 'Shift Left',0Dh,0Ah
ShiftR db 'Shift Right',0Dh,0Ah
ScrollL db 'ScrollLock',0Dh,0Ah
NumLock db 'NumLock',0Dh,0Ah
CapsL db 'CapsLock',0Dh,0Ah
Insert db 'Insert',0Dh,0Ah
dw 0ABCDh
int9:
push AX ;Сохранение регистров
push BX
push CX
push DX
push BP
push ES
push DS

xor AX,AX ;Выход при Ctrl+X
mov ES,AX
mov AL,ES:0417h
test AL,00000100b
jz no
in AL,60h
cmp AL,2Dh ;Сравнение со скан кодом X (2Dh)
je unload1
cmp AL,1Fh ;Сравнение со скан кодом S (1Fh)
je stat
no:
jmp noact
unload1:
jmp unload
Stat:

mov AH,0Fh ;Определяем текущую страницу
int 10h ;и количество столбцов
mov apage,BH
mov AL,AH

mov AH,03h ;Определяем положение курсора
int 10h
mov kursor,DX

mov AH,06h ;Очищаем 7 строк для вывода
mov DL,AL
dec DH
xor CX,CX
mov BH,1
mov AL,9
int 10h

test byte ptr es:0417h, 01000000b
je drg
mov AX,1300h ;Выводим информацию
mov DX,kursor
sub DH,7
xor DL,DL
mov BH,apage
mov BL,7
mov CX,8
push CS
pop ES
mov BP,offset CapsL
int 10h
drg:
test byte ptr es:0417h, 00100000b

jz noact
mov AX,1300h ;Выводим информацию
mov DX,kursor
sub DH,7
xor DL,DL
mov BH,apage
mov BL,7
mov CX,8
push CS
pop ES
mov BP,offset NumLock
int 10h



noact:
pop DS ;Восстановление регистров
pop ES
pop BP
pop DX
pop CX
pop BX
pop AX
jmp CS:oldint9

unload:
push DS

mov AX,2509h ;Восстановление исходного
;вектора 9 прерывания
lds DX,CS:oldint9
int 21h

pop DS

mov ES,CS:002Ch ;Выгрузка окружения
mov AH,49h
int 21h

push CS ;Выгрузка программы
pop ES
mov AH,49h
int 21h

jmp noact

endrz:
;************************************************
mes_l db 'Rezident loaded',0Dh,0Ah,'$'
mes_nol db 'Rezident is loaded',0Dh,0Ah,'$'
init:
mov AX,3509h ;Проверка на повторную загрузку,
int 21h ;сохранение старого
cmp ES:[BX-2],0ABCDh ;и установка нового вектора 9 прер.
je exit
mov word ptr oldint9+2,ES
mov word ptr oldint9,BX
mov AX,2509h
mov DX,offset int9
int 21h

mov AH,9
mov DX,offset mes_l
int 21h

mov DX,offset endrz ;Завершаем программу,
int 27h ;оставляя резидентную часть
exit:
mov AH,9
mov DX,offset mes_nol
int 21h

mov AX,4C00h
int 21h
CSEG ENDS
END start

Обсуждение

Форма ответа