0,0 → 1,123 |
; |
; Kolibri Fast Calls test |
; |
; Compile with FASM for Kolibri |
; |
; |
SYSENTER_VAR equ 0 |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd START |
dd I_END |
dd 0x1000 |
dd 0x1000 |
dd 0x0, 0x0 |
|
include 'macros.inc' |
include 'debug.inc' |
|
START: |
mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
push ecx |
syscall |
pop ecx |
|
|
print '! Alive !' |
|
xor eax, eax |
cpuid |
rdtsc |
mov [old_tsc], eax |
mov [old_tsc + 4], edx |
|
; ÷åðåç áûñòðûé âûçîâ |
test1: mov ebx, 0x100000 |
mov dword[SYSENTER_VAR], .ret_p |
mov [SYSENTER_VAR + 4], esp |
align 32 |
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
sysenter ; ïîðòÿòñÿ ecx, edx |
.ret_p: dec ebx |
jnz .nxt |
|
xor eax, eax |
cpuid |
rdtsc |
cmp eax, [old_tsc] |
jnb @f |
dec edx |
@@: sub eax, [old_tsc] |
sub edx, [old_tsc + 4] |
debug_print_hex edx |
debug_print_hex eax |
print ' <- Fast call' |
|
|
|
xor eax, eax |
cpuid |
rdtsc |
mov [old_tsc], eax |
mov [old_tsc + 4], edx |
; ÷åðåç øëþç ïðåðûâàíèÿ |
test2: mov ebx, 0x100000 |
align 32 |
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
int 0x40 |
dec ebx |
jnz .nxt |
|
xor eax, eax |
cpuid |
rdtsc |
cmp eax, [old_tsc] |
jnb @f |
dec edx |
@@: sub eax, [old_tsc] |
sub edx, [old_tsc + 4] |
debug_print_hex edx |
debug_print_hex eax |
print ' <- Interrupt' |
|
call show_alive |
mov eax, -1 |
int 0x40 |
;--------------------------------------------- |
show_alive: |
; ÷åðåç áûñòðûé âûçîâ, íàñòðàèâàåì ðåãèñòðû äëÿ âîçâðàòà |
mov eax, 63 |
mov ebx, 1 |
mov esi, msg_Ok |
.nxt: mov cl, [esi] |
test cl, cl |
jz .end |
|
mov dword[SYSENTER_VAR], .ret_p |
mov [SYSENTER_VAR + 4], esp |
sysenter ; ïîðòÿòñÿ ecx, edx |
|
.ret_p: inc esi |
jmp .nxt |
.end: ret |
; ÷åðåç øëþç ïðåðûâàíèÿ |
; mov eax, 63 |
; mov ebx, 1 |
; mov esi, msg_Ok |
; @@: mov cl, [esi] |
; test cl, cl |
; jz @f |
|
; int 0x40 |
|
; inc esi |
; jmp @b |
; @@: ret |
|
|
old_tsc: dd 0, 0 |
|
msg_Ok db 'Alive!', 10, 13, 0 |
I_END: |