data segment
cur_attr db 14
OLD_CS dw ?
OLD_IP dw ?
data ends
code segment
assume cs:code,ds:data
NEW_5h proc far
push es
push ax
push bx
mov cx,290
mov ax, 0B800h
mov es, ax
xor ax,ax
xor bx,bx
inc bx
add cur_attr,1
cmp cur_attr,16
jne cycle3
mov cur_attr,0
cycle3:
mov ah, cur_attr
mov byte ptr es:[bx], ah
inc bx
inc bx
loop cycle3
pop bx
pop ax
pop es
iret
NEW_5h endp
CLS proc near
push cx
push ax
push si
xor si, si
mov ah, 7
mov cx, 2000
CL1: mov es:[si], ax
inc si
inc si
loop CL1
pop si
pop ax
pop cx
ret
CLS endp
begin:
mov ax,data
mov ds,ax
mov ah, 35h
mov al, 5h
int 21h
mov OLD_IP, bx
mov OLD_CS, es
mov ah, 25h
mov al, 5h
push ds
mov dx, offset NEW_5h
mov bx,seg New_5h
mov ds, bx
int 21h
pop ds
mov ax, 0B800h
mov es, ax
call CLS
xor si,si
xor bx,bx
mov cx,290
cycle1:mov al,ds:[si+40]
mov ah, 14
mov es:[bx], ax
inc bx
inc bx
inc si
loop cycle1
mov ax,data
mov ds,ax
mov es,ax
mov ax, 40h
mov es, ax
cycle2:mov ax, es:[1ch]
mov bx, es:[1ah]
cmp bx , ax
jz cycle2
ext:push ds
xor ax,ax
mov ah,25h
mov al, 5h
mov dx,OLD_IP
mov bx,OLD_CS
mov ds, bx
int 21h
pop ds
xor ax,ax
mov ax, 4c00h
int 21h
code ends
end begin
проблемы с перехватом Int 5h
Пытался заменить вектор 5го прерывания.на PrintScreen у меня было установленно свое действие,но вектор почему то не менялся,а может и менялся,я в сегменте биос не смотрел,менял через 25ю функцию 21го прерывания.когда запускал программу и нажимал клавишу то происходил именно PrintScreen,тоесть изображение сохранялось в буфер,а не выполнялась моя подпрограмма.То же самое,но для 1Ch работало нормально,да и на другие клавиши,если через буффер клавиотуры.Почему так?Все это проделывалось на TASM'е.
Цитата:
К сожалению все гадалки в отпуске.
Код пожалуйста.
А вообще ручная работа самый верный способ, почитай
Калашников - Ассемблерo Это просто! Учимся программировать, Глава 10,пункт 3.1, там всё ясно написанно(даже у меня получилось :) ).
а под какой осью перехватываешь?
Думаю, в обработчике лучше сохранять все используемые регистры.
Цитата: Phantom-84
Думаю, в обработчике лучше сохранять все используемые регистры.
Пробовал,не помогло.Думаю дело в каких то премудростях винды или транслятора.С другим прерыванием ведь работает.Да и процедура рабочая.
Я конечно понимаю что винда его программу скорее всего запускает под V86 но разве она разрешит замену обработчика?
Винда (WinNT) запускает DOS-приложения под вирутальной машиной (процесс NTVDM.EXE), так вот даже если обработчик заменён правильно и всё нормально работает, то при нажатии на клавишу PrintScreen винда просто-напросто не вызывает этот обработчик в вирутальной машине.
Цитата: ahilles
просто-напросто не вызывает этот обработчик в вирутальной машине.
И как этот печальный факт можно обойти?Используя только ТАСМ.
На NT - никак.. покрайней мере, когда я писал лабы по асму, бутался с реаниматора под досом и наслаждался.
Ну если ты просто изучаешь ASM тогда ставь VMware или БОш а на них DOS там можно всё, а если что-то пишешь, то наверное придёться разбираться с WinAPI, но обработчик прерывания ты всёравно не заменишь.
В свойствах DOS приложения есть флажок разрешающий использование PrintScreen в DOS программе. Так же можно разрешить и некоторые другие комбинации клавиш (например, Ctrl + Esc). А вот программно разрешить думаю не получится.