.586p _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' ALIGN 4 ;; DWORD cpuid(DWORD dwOP, DWORD *lpAX, DWORD *lpBX, DWORD *lpCX, DWORD *lpDX) _cpuid PROC NEAR ;; ... ;; ESP+0C [lpBX] ;; ESP+08 [lpAX] ;; ESP+04 [dwOP] ;; ESP+00 [RETURN-ADDESS] PUSH EBP MOV EBP, ESP ;; ... ;; ESP+0C [lpAX] ;; ESP+08 [dwOP] ;; ESP+04 [RETURN-ADDRESS] ;; ESP+00 [EBP] ;; EBP == ESP PUSH EDI ;PUSH EAX PUSH EBX PUSH ECX PUSH EDX ;; EAX = dwOP; MOV EAX, DWORD PTR [EBP+1*4+4] CPUID ;; EDI = lpAX; MOV EDI, DWORD PTR [EBP+2*4+4] ;; *EDI = EAX; MOV DWORD PTR [EDI], EAX ;; *lpBX = EBX; MOV EDI, DWORD PTR [EBP+3*4+4] MOV DWORD PTR [EDI], EBX ;; *lpCX = ECX; MOV EDI, DWORD PTR [EBP+4*4+4] MOV DWORD PTR [EDI], ECX ;; *lpDX = EDX MOV EDI, DWORD PTR [EBP+5*4+4] MOV DWORD PTR [EDI], EDX POP EDX POP ECX POP EBX ;POP EAX POP EDI ;; return dwOP; MOV EAX, DWORD PTR [EBP+1*4+4] POP EBP RET _cpuid ENDP ;; struct { ;; DWORD dwLower; ;; DWORD dwUpper; ;; } rdtsc(); _rdtsc PROC NEAR ;; ... ;; ESP+0C [CALLER'S LOCAL VARIABLES] ;; ESP+08 [CALLER'S LOCAL VARIABLES] ;; ESP+04 [POINTER TO RETURN VALUE] ;; ESP+00 [RETURN ADDRESS] PUSH EDI PUSH EAX PUSH EDX ;; ... ;; ESP+14 [CALLER'S LOCAL VARIABLES] ;; ESP+10 [POINTER TO RETURN VALUE] ;; ESP+0C [RETURN ADDRESS] ;; ESP+08 [EDI] ;; ESP+04 [EAX] ;; ESP+00 [EDX] MOV EDI, DWORD PTR [ESP+10H] RDTSC MOV DWORD PTR [EDI+0], EAX MOV DWORD PTR [EDI+4], EDX POP EDX POP EAX POP EDI XOR EAX, EAX RET _rdtsc ENDP _TEXT ENDS PUBLIC _cpuid PUBLIC _rdtsc END ;; THE END OF FILE