104 lines
1.2 KiB
ArmAsm
104 lines
1.2 KiB
ArmAsm
.data
|
|
ds:
|
|
.word 0
|
|
es:
|
|
.word 0
|
|
fs:
|
|
.word 0
|
|
gs:
|
|
.word 0
|
|
|
|
.globl int86
|
|
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
|