Mikrosekundy vo Windows a este vo Visual Basicu?
Instrukcia RDTSC pomoze, ale vo Windows to nie je take jednoduche.
Toto som robil do UniFlashu (v Pascale - ale tam toho Pascalu je, ze)
Na zaciatku to treba kalibrovat:Kód:procedure _Delay; {v1.22} begin Delay(100); end; procedure InitTSC;assembler; {Requires Pentium or newer CPU} {v1.22} asm pushf {PUSHF} cli {CLI} dw 310fh {RDTSC} db 66h push ax {PUSH EAX} call _Delay {DELAY(100)} {Delay 100ms} dw 310fh {RDTSC} db 66h pop bx {POP EBX} db 66h sub ax,bx {SUB EAX,EBX} {Ticks elapsed ->EAX} db 66h mov word ptr tsc,ax {MOV TSC,EAX} {Ticks per second} popf {POPF} {Instead of STI} end; {$F+} procedure TSCWait(MicroSec:LongInt);assembler; {v1.22} asm dw 310fh {RDTSC} db 66h mov bx,ax {MOV EBX,EAX} db 66h mov cx,dx {MOV ECX,EDX} db 66h mov ax,word ptr MicroSec {MOV EAX,MicroSec} db 66h mul word ptr uSec {MUL uSec} {Ticks to wait ->EDX:EAX} db 66h add bx,ax {ADD EBX,EAX} db 66h adc cx,dx {ADC ECX,EDX} @:dw 310fh {RDTSC} db 66h cmp dx,cx {CMP EDX,ECX} {Waiting enough?} je @low {JE @low} {Waiting enough (high)} ja @exit {JA @exit} {Waiting more! Exit!} jmp @ {JMP @} {Not enough, wait more} @low: db 66h cmp ax,bx {CMP EAX,EBX} {Waiting enough?} jae @exit {JL @} {Not enough, wait more} jmp @ @exit: end; {$F-} function TSCPresent:Boolean;assembler; {v1.22} asm db 66h pushf {PUSHFD} db 66h pop ax {POP EAX} {Read EFLAGS register to EAX} db 66h push ax {PUSH EAX} {Save it for later use} db 66h or ax,0h dw 20h {OR EAX,200000h} {Set CPUID bit} db 66h push ax {PUSH EAX} db 66h popf {POPFD} {Put EAX to EFLAGS} db 66h pushf {PUSHFD} db 66h pop ax {POP EAX} {Read back EFLAGS to EAX} db 66h and ax,0h dw 20h {AND EAX,200000h} db 66h cmp ax,0h dw 20h {CMP EAX,200000h} {Is CPUID bit set?} jne @bad {JNE @BAD} {If not, CPUID not supported} db 66h xor ax,ax {XOR EAX,EAX} dw 0a20fh {CPUID} {Call level 0 CPUID} dd 0f88366h {CMP EAX,0} {Is MaxLevel 0?} je @bad {JE @BAD} {If yes, it's bad, we need 1} db 66h xor ax,ax {XOR EAX,EAX} db 66h inc ax {INC EAX} {MOV EAX,1} dw 0a20fh {CPUID} {Call level 1 CPUID} dd 10e28366h {AND EDX,10h} db 66h cmp dx,10h {CMP EDX,10h} {Is TSC bit set?} jne @bad {JNE @BAD} {If not, TSC not present} mov ax,1 {MOV AX,1} {Return TRUE} jmp @exit @bad: xor ax,ax {XOR AX,AX} {Return FALSE} jmp @exit @exit: db 66h popf {POPFD} {Restore EFLAGS register} end;
Funkcia Delay musi byt aspon trochu presna, aby to fungovalo.Kód:InitTSC; uSec:=TSC div 100000;





Odpověď s citací