;; CPUID.ASM - ;; $Id$ .code ;; typedef unsigned int uint32; ;; typedef unsigned __int64 uint64; ;; assert(sizeof(uint32)*8 == 32); ;; assert(sizeof(uint64)*8 == 64); ;; void __fastcall cpuid(DWORD dwOP, DWORD *lpAX, DWORD *lpBX, DWORD *lpCX, DWORD *lpDX); _cpuid PROC PUSH RBP MOV RBP, RSP ;; RSP+30H [lpDX] ;; RSP+28H [ROOM FOR lpCX] ;; RSP+20H [ROOM FOR lpBX] ;; RSP+18H [ROOM FOR lpAX] ;; RSP+14H [ROOM FOR dwOP] ;; RSP+10H [PADDING FOR dwOP] ;; RSP+08H [RETURN-ADDRESS] ;; RSP+00H [RBP] ;; RBP == RSP MOV DWORD PTR [RBP+10H], 0 MOV DWORD PTR [RBP+14H], ECX MOV QWORD PTR [RBP+18H], RDX MOV QWORD PTR [RBP+20H], R8 MOV QWORD PTR [RBP+28H], R9 ;; RCX, RDX are volatile PUSH RBX PUSH RDI MOV EAX, DWORD PTR [RBP+14H] CPUID ;; EDI = lpAX; MOV RDI, QWORD PTR [RBP+18H] ;; *EDI = EAX; MOV DWORD PTR [RDI], EAX ;; *lpBX = EBX; MOV RDI, QWORD PTR [RBP+20H] MOV DWORD PTR [RDI], EBX ;; *lpCX = ECX; MOV RDI, QWORD PTR [RBP+28H] MOV DWORD PTR [RDI], ECX ;; *lpDX = EDX MOV RDI, QWORD PTR [RBP+30H] MOV DWORD PTR [RDI], EDX POP RDI POP RBX XOR RAX, RAX POP RBP RET _cpuid ENDP ;; uint64 __fastcall rdtsc(void); _rdtsc PROC RDTSC AND RAX, 00000000FFFFFFFFH AND RDX, 00000000FFFFFFFFH SHL RDX, 32 OR RAX, RDX RET _rdtsc ENDP PUBLIC _cpuid PUBLIC _rdtsc END ;; THE END OF FILE