Subversion Repositories Kolibri OS

Rev

Rev 398 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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: