(Interrupt) . .
x86 ( ) (exception), , . int; . 256 , -, .
. , , x86.
, , . , ().
, . ( iret retf), ( ret 2). (far) á , .
, TSR (Terminate-and-Stay-Resident) , , , . , .
, / .
:
, ( );
, ;
, ;
, ;
, , .
().
|
|
1. .
New_Handler PROC FAR
push ;
;
pop ;
iret;
New_Handler ENDP
2. ( ) .
New_Handler PROC FAR
push ;
;
pop ;
jmp dword ptr cs:old_handler_off;
New_Handler ENDP
3. , (, )
New_Handler PROC FAR
push ;
;
pop ;
pushf;
call dword ptr cs:old_handler_off;
iret;
New_Handler ENDP
4. , , , .
New_Handler PROC FAR
push ;
;
pop ;
pushf;
call dword ptr cs:old_handler_off;
push
;
pop
iret;
New_Handler ENDP
, . , , , -, call far jmp far . ó :
pushf
push <segment_to_jmp>
push <offset_to_jmp>
retf
Ÿ jmp far, , . , , . : , , , , . call far.
, . .
mov al, 20h
out 20h, al
, , .
IF. , . , ( ret 2), FLAGS .
MS-DOS int 21h , .
|
|
AH = 25h . : AL , DS:DX .
AH = 35h . : AL . : ES:BX .
AH = 31h . : AL , DX ( ).
, , .
;
Start:
jmp Init
;
old_handler_off DW?
old_handler_seg DW?
;
New_Handler PROC FAR
call dword ptr cs:old_handler_off
iret
New_Handler ENDP
;
;
Init:
;
;
mov ah, 35h
mov al, <_>
int 21h
mov cs:old_handler_off, bx
mov cs:old_handler_seg, es
;
mov ah, 25h
mov al, <_>
mov dx, seg New_Handler
mov ds, dx
lea dx, New_Handler
int 21h
;
;
; ( TSR)
mov ax, 3100h
mov dx, offset Init
add dx, 0Fh
shr dx, 1
shr dx, 1
shr dx, 1
shr dx, 1
int 21h
END Init
Start: jmp END . , . , COM ( TINY) , . COM- ORG 100h PSP.
. , - , , . . MS‑DOS , ( ), .
: , , . . , , . , . , , . : , , , . .
, , , .
MS-DOS , . , . .
|
|
1. .
2. .
3. .
4. BIOS DOS.
5. () .
6. .
7. .
8. .
9. , .
10. .
4.3.1. , ( a) ( b).
4.3.2. , .
4.3.3. , .
4.3.4. , . , 1 11.
4.3.5. , .
4.3.6. , ( ).
4.3.7. , summa.
4.3.8. , .
4.3.9. , .
4.3.10. , (, ) ( go).
4.3.11. 21h , 09h ( ).
4.3.12. 21h , 09h , .
4.3.13. 21h , 09h .
4.3.14. 21h , 0Ah .
4.3.15. ( ).
( ) . . . .
16. ( ).
, BIOS DOS, , .
5
:
1) , ;
2) ;
3) .