18,15 → 18,15 |
include 'macros.inc' |
include 'debug.inc' |
|
START: |
mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
push ecx |
syscall |
pop ecx |
|
|
print '! Alive !' |
|
START: print 'Please wait' |
; ÷åðåç áûñòðûé âûçîâ (SYSENTER) |
test1: mov eax, 1 |
cpuid |
test edx, 0x800 |
jnz .ok |
dps 'unsupported ' |
jmp .end |
.ok: |
xor eax, eax |
cpuid |
rdtsc |
33,8 → 33,7 |
mov [old_tsc], eax |
mov [old_tsc + 4], edx |
|
; ÷åðåç áûñòðûé âûçîâ |
test1: mov ebx, 0x100000 |
mov ebx, 0x100000 |
mov dword[SYSENTER_VAR], .ret_p |
mov [SYSENTER_VAR + 4], esp |
align 32 |
53,17 → 52,57 |
sub edx, [old_tsc + 4] |
debug_print_hex edx |
debug_print_hex eax |
print ' <- Fast call' |
.end: print ' <- Fast call (SYSENTER)' |
|
;---------------------------------------------- |
; ÷åðåç áûñòðûé âûçîâ (SYSCALL) |
test2: xor eax, eax |
cpuid |
cmp ecx, "cAMD" |
je .ok |
.nf: dps 'unsupported ' |
jmp .end |
.ok: mov eax, 0x80000001 |
cpuid |
test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support |
jz .nf |
|
xor eax, eax |
cpuid |
rdtsc |
mov [old_tsc], eax |
mov [old_tsc + 4], edx |
|
mov ebx, 0x100000 |
align 32 |
.nxt: mov eax, 19 |
push ecx |
syscall |
pop ecx |
|
.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 |
.end: print ' <- Fast call (SYSCALL)' |
;---------------------------------------------- |
; ÷åðåç øëþç ïðåðûâàíèÿ |
xor eax, eax |
cpuid |
rdtsc |
mov [old_tsc], eax |
mov [old_tsc + 4], edx |
; ÷åðåç øëþç ïðåðûâàíèÿ |
test2: mov ebx, 0x100000 |
|
test3: mov ebx, 0x100000 |
align 32 |
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
int 0x40 |