kolibrios/programs/develop/fast_call_test/test.ASM

123 lines
1.9 KiB
NASM
Raw Normal View History

;
; 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 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
push ecx
syscall
pop ecx
print '! Alive !'
xor eax, eax
cpuid
rdtsc
mov [old_tsc], eax
mov [old_tsc + 4], edx
; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
test1: mov ebx, 0x100000
mov dword[SYSENTER_VAR], .ret_p
mov [SYSENTER_VAR + 4], esp
align 32
.nxt: mov eax, 19 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sysenter ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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
; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
test2: mov ebx, 0x100000
align 32
.nxt: mov eax, 19 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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:
; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecx, edx
.ret_p: inc esi
jmp .nxt
.end: ret
; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; 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: