1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
struct REGPACK
{
unsigned r_ax, r_bx, r_cx, r_dx;
unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags;
};
/* DANGER DANGER -- Self modifying code! */
#asm
.text
save_sp:
dw 0
#endasm
intr(intr, regs)
int intr;
struct REGPACK * regs;
{
#asm
mov bx,sp
push bp
push si
push di
push es
push ds
mov ax,[bx+2]
seg cs
mov [intr_inst+1],al
seg cs
mov [save_sp],sp
mov bx,[bx+4]
mov ah,[bx+18] ! Flags low byte
sahf
mov ax,[bx]
push [bx+2]
mov cx,[bx+4]
mov dx,[bx+6]
mov bp,[bx+8]
mov si,[bx+10]
mov di,[bx+12]
mov es,[bx+16]
mov ds,[bx+14]
pop bx
intr_inst:
int $FF ! Must be a real int .. consider protected mode.
seg cs ! Could be SS as DS==SS
mov sp,[save_sp]
seg cs
mov [save_sp],ds
pop ds
push [save_sp]
push bx
mov bx,sp
mov bx,[bx+12]
mov [bx],ax
pop [bx+2]
mov [bx+4],cx
mov [bx+6],dx
mov [bx+8],bp
mov [bx+10],si
mov [bx+12],di
pop [bx+14]
mov [bx+16],es
pushf
pop [bx+18]
pop es
pop di
pop si
pop bp
#endasm
}
|