Install new int 9 interrupt routine
Requirement:
Install A new int 9 interrupt routine, function: under DOS, after pressing the "A" key, unless it is not released, if it is released, the screen will be full of "A", and other keys will be processed as usual.
Personal analysis:
I think this interrupt routine is essentially to judge whether the scanning code processed by the original int 9 is A interrupt code. If it is A full screen "A", if it is not processed as usual, there is only one thing I care about: when A is pressed, nothing is output or processed as usual. Due to the limitation of Chinese level, I'm not sure here. I deal with it as usual. If you find any wrong message, thank you.
Other attention details have been informed at the inspection point, which is not much nonsense.
Assembly code:
assume cs:code
code segment
start:
sli ;Prevent errors caused by keyboard input before setting interrupt vector table
mov ax, cs
mov ds, ax
mov si, offset int9
mov ax, 0
mov es, ax
mov di, 204h ;[200]And[202]To store the original int 9 Of IP and CS
mov cx, offset int9_end - offset int9
cld ;Forward replication
rep movsb
mov ax, es:[9*4]
mov es:[200h], ax
mov ax, es:[9*4+2]
mov es:[202h], ax ;Preserve original int 9 Interrupt routine entry address
mov word ptr es:[9*4], 204h
mov word ptr es:[9*4+2], 0 ;Set interrupt vector table
sti ;IF Set 1
mov ax, 4c00h
int 21h
----------------------int9-------------------------
int9:
push ds
push ax
push cx
push si
in al, 60h ;Accept 60 h Scan code from
pushf
call dword ptr cs:[200h]
cmp al, 1eh+80h ;A Is it released
jne int9_ok ;Not releasing normal handling
mov ax, 0b800h
mov ds, ax
mov si, 0
mov cx, 2000 ;It's 2000 characters on a screen
print_char:
mov byte ptr [si], 'A'
add si, 2
loop print_char
int9_ok:
pop si
pop cx
pop ax
pop ds
iret
int9_end:
nop
code ends
end start
Operation result:
Other characters are processed as usual:
After releasing A, press A to take A screenshot: