Subversion Repositories Kolibri OS

Rev

Rev 398 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
375 Ghost 1
;
2
; Kolibri Fast Calls test
3
;
4
;   Compile with FASM for Kolibri
5
;
6
;
7
SYSENTER_VAR	equ	0
8
use32
9
org	0x0
10
	db    'MENUET01'
11
	dd     0x01
12
	dd     START
13
	dd     I_END
14
	dd     0x1000
15
	dd     0x1000
16
	dd     0x0, 0x0
17
 
18
include 'macros.inc'
19
include 'debug.inc'
20
 
21
START:
22
	mov	eax, 19		; функция пустышка
23
	push	ecx
24
	syscall
25
	pop	ecx
26
 
27
 
28
	print	'! Alive !'
29
 
30
	xor	eax, eax
31
	cpuid
32
	rdtsc
33
	mov	[old_tsc], eax
34
	mov	[old_tsc + 4], edx
35
 
36
; через быстрый вызов
37
test1:	mov	ebx, 0x100000
38
	mov	dword[SYSENTER_VAR], .ret_p
39
	mov	[SYSENTER_VAR + 4], esp
40
	align	32
41
.nxt:	mov	eax, 19 	; функция пустышка
42
	sysenter		; портятся ecx, edx
43
.ret_p: dec	ebx
44
	jnz	.nxt
45
 
46
	xor	eax, eax
47
	cpuid
48
	rdtsc
49
	cmp	eax, [old_tsc]
50
	jnb	@f
51
	dec	edx
52
@@:	sub	eax, [old_tsc]
53
	sub	edx, [old_tsc + 4]
54
	debug_print_hex edx
55
	debug_print_hex eax
56
	print	' <- Fast call'
57
 
58
 
59
 
60
	xor	eax, eax
61
	cpuid
62
	rdtsc
63
	mov	[old_tsc], eax
64
	mov	[old_tsc + 4], edx
65
; через шлюз прерывания
66
test2:	mov	ebx, 0x100000
67
	align	32
68
.nxt:	mov	eax, 19 	; функция пустышка
69
	int	0x40
70
	dec	ebx
71
	jnz	.nxt
72
 
73
	xor	eax, eax
74
	cpuid
75
	rdtsc
76
	cmp	eax, [old_tsc]
77
	jnb	@f
78
	dec	edx
79
@@:	sub	eax, [old_tsc]
80
	sub	edx, [old_tsc + 4]
81
	debug_print_hex edx
82
	debug_print_hex eax
83
	print	' <- Interrupt'
84
 
85
	call	show_alive
86
	mov	eax, -1
87
	int	0x40
88
;---------------------------------------------
89
show_alive:
90
	; через быстрый вызов, настраиваем регистры для возврата
91
	mov	eax, 63
92
	mov	ebx, 1
93
	mov	esi, msg_Ok
94
.nxt:	mov	cl, [esi]
95
	test	cl, cl
96
	jz	.end
97
 
98
	mov	dword[SYSENTER_VAR], .ret_p
99
	mov	[SYSENTER_VAR + 4], esp
100
	sysenter		; портятся ecx, edx
101
 
102
.ret_p: inc	esi
103
	jmp	.nxt
104
.end:	ret
105
	; через шлюз прерывания
106
	; mov   eax, 63
107
	; mov   ebx, 1
108
	; mov   esi, msg_Ok
109
; @@:   mov     cl, [esi]
110
	; test  cl, cl
111
	; jz    @f
112
 
113
	; int   0x40
114
 
115
	; inc   esi
116
	; jmp   @b
117
; @@:   ret
118
 
119
 
120
old_tsc:	dd	0, 0
121
 
122
msg_Ok	db	'Alive!', 10, 13, 0
123
I_END: