티스토리 뷰


 어셈블리어에서 int 9를 재정의하는 코드입니다.
 
 아래는 코드입니다.
 
 명령어를 조금 설명하자면,
 in  = input form port
 test = logical compare
 out = out to port

... 정확한건 명령어 설명은,
http://download.intel.com/design/intarch/manuals/24319101.pdf
여기서 보세요..

 
 1 
 2 MAIN SEGMENT PUBLIC                        
 3     ASSUME CS:MAIN, DS:MAIN
 4                 
 5     MOV AX, MAIN                    ; Set up the Data Segment address
 6     MOV DS, AX
 7     
 8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 9 
10     mov ax, 0
11     mov ds, ax
12 
13     mov bx, 09h * 04h ;find the int 9
14 
15     mov dx, word ptr [bx]
16     push dx
17     mov dx, word ptr [bx]+2
18     push dx
19     ; 원래의 int 9를 스택에 저장한후
20     
21     mov ax, 0
22     mov dx, ax
23 
24     mov bx, 09h * 04h
25 
26     cli ; disable an interrupt
27     mov word ptr [bx], offset kbd_handler ; load your keyboard ISR
28     mov word ptr [bx]+2, seg kbd_handler
29     sti ;enable interrupts    
30     ; 새롭게 정의한 int 9를 삽입합니다. (kbd_handler로 삽입됨)
31     
32     
33     ;;;;;;;;;;;;;;;;;;;;;;
34     ;
35     ; 원하는 코드 입력
36     ;
37     ;;;;;;;;;;;;;;;;;;;;;;;
38     
39     
40     ;원래의 코드로 복귀합니다. (스택에 저장된 코드를 다시 백업)
41     mov ax, 0
42     mov dx, ax
43     
44     mov bx, 09h * 04h
45     
46     cli ; disable interrupt
47     pop dx
48     mov word ptr [bx], dx ;back to normal address
49     pop dx
50     mov word ptr [bx]+2, dx
51     sti ; enalbe interrupts  
52     
53     
54     
55     MOV AH, 4CH                        ; 프로그램을 종료
56     INT 21H                  
57 
58 PUBLIC    kbd_handler
59 kbd_handler   PROC    NEAR
60     push ax
61     push bx
62     push cx
63     push dx                                          
64     push sp
65     push bp
66     push si
67     push di
68     
69     in al, 64h
70     test al, 01h
71     
72     in al, 60h
73     
74     ;;;;;;;;;;;;;;;;
75     ; al 에 키보드 입력값이 들어와 있습니다.
76     ; 아스키 코드가 아니라 scan 코드로 받습니다.
77     ;;;;;;;;;;;;;;;;
78     
79     mov al, 20h
80     out 20h, al
81     
82     pop di
83     pop si
84     pop bp
85     pop sp
86     pop dx
87     pop cx
88     pop bx
89     pop ax    
90         
91     IRET
92 kbd_handler   ENDP
93     
94 MAIN ENDS
95         END