home *** CD-ROM | disk | FTP | other *** search
- .data
- ds:
- .word 0
- es:
- .word 0
- fs:
- .word 0
- gs:
- .word 0
-
- int86:
- .byte 0x2e
- push ds
- pop %ds
- .byte 0x2e
- push es
- pop %es
- .byte 0x2e
- push fs
- pop %fs
- .byte 0x2e
- push gs
- pop %gs
-
- .byte 0xcd
- int86_vec:
- .byte 0x03
- ret
-
- .text
- .globl _int86x
- _int86x:
- movl 16(%esp), %eax
-
- movw 2(%eax), %cx
- movw %cx, ds
- movw 4(%eax), %cx
- movw %cx, es
- movw 6(%eax), %cx
- movw %cx, fs
- movw 8(%eax), %cx
- movw %cx, gs
-
- jmp int86_common
-
- .globl _int86
- _int86:
- movw %ds, %ax
- movw %ax, ds
- movw %ax, es
- movw %ax, fs
- movw %ax, gs
- jmp int86_common
-
- int86_common:
- pushl %ebp
- movl %esp,%ebp
- pushl %ebx
- pushl %esi
- pushl %edi
- pushf
-
- movl 8(%ebp),%eax
- movb %al,int86_vec
-
- movl 12(%ebp),%eax
- movl 4(%eax),%ebx
- movl 8(%eax),%ecx
- movl 12(%eax),%edx
- movl 16(%eax),%esi
- movl 20(%eax),%edi
- movl (%eax),%eax
-
- push %ds
- push %es
- call int86
- pop %es
- pop %ds
-
- pushf
- pushl %eax
- movl %esp,%ebp
- addl $24,%ebp
- movl 16(%ebp),%eax
- popl (%eax)
- movl %ebx,4(%eax)
- movl %ecx,8(%eax)
- movl %edx,12(%eax)
- movl %esi,16(%eax)
- movl %edi,20(%eax)
- popl %ebx /* flags */
- movl %ebx,28(%eax)
- andl $1,%ebx
- movl %ebx,24(%eax)
- movl (%eax),%eax
-
- popf
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
- ret
-