Inline Assembler in VC++ - RDTSC



  • Hallo!

    Ich kenne mich eigentlich nicht in Assembler aus daher würde ich gerne wissen wo der Unterschied zwischen Code1 und Code2 ist. (Visual C++)
    Code1 ist mehr oder weniger von mir und soll eigentlich den RDTSC auslesen und zurückgeben. Nun bin ich aber über Code2 gestolpert und da dieser andere Werte zurückgibt wollte ich wissen was Code2 im einzelnen macht bzw. welcher Code wirklich den RDTSC ausliest.

    Code1

    inline void __rdtsc(void)
    {
    	__asm
    	{
    		_emit 0fh
    		_emit 031h
    	}
    }
    
    inline void __fastcall get_rdtsc(unsigned __int64 &u64)
    {
    	ULARGE_INTEGER ul;
    
    	__rdtsc();
    
    	__asm mov ul.LowPart, eax
    	__asm mov ul.HighPart, edx
    
    	u64 = ul.QuadPart;
    }
    

    Code2

    inline unsigned __int64 gettick(void)
    {
    	unsigned __int64 r = 0;
    	void *_ptr = &r;
    
    	__asm
    	{
    		rdtsc;
    		mov ebx, _ptr;
    		mov dword ptr[ebx    ], eax;
    		mov dword ptr[ebx + 4], eax;
    	}
    
    	return r;
    }
    

    P.S.: ULARGE_INTEGER ist aus der "winnt.h" und wie folgt definiert

    typedef union _ULARGE_INTEGER { 
        struct {
            DWORD LowPart; 
            DWORD HighPart; 
        };
        ULONGLONG QuadPart;
    } ULARGE_INTEGER;
    

    Gruß Alexander



  • vermute mal dass der code2 deshalb andere Werte ausgibt weil:

    mov dword ptr[ebx    ], eax;
    mov dword ptr[ebx + 4], eax <=;
    

    hier zwei mal eax, aber kein edx kopiert werden.

    Deine funktion schein richtig zu sein.



  • CDW schrieb:

    vermute mal dass der code2 deshalb andere Werte ausgibt weil:

    mov dword ptr[ebx    ], eax;
    mov dword ptr[ebx + 4], eax <=;
    

    hier zwei mal eax, aber kein edx kopiert werden.

    Deine funktion schein richtig zu sein.

    Wie unangenehm. Das war natürlich mein Fehler beim Abschreiben. Beim zweiten wird natürlich "edx" kopiert. Nun sind die Werte auch annähernd gleich.

    Besten Dank - Alexander


Anmelden zum Antworten