nochmal wegen RDTSC *grumml*



  • hi,

    ich hab den quellcode des cpu-mhz programms nochmal mit dem borland free compiler 5.5 compilieren lassen. der compiler meckert nicht allzuviel rum sondern warnt nur wegen asm code in einer funktion.
    der TASM aber mag dann garnicht mehr und meldet 2 fehler:
    *
    Warning W8002 ProSpeed.cpp 12: Restarting compile using assembly in function Get
    MHZ()
    Turbo Assembler Version 5.0r Copyright (c) 1988, 1996 Borland International
    Serial No: Tester:

    Assembling file: ProSpeed.ASM
    **Error** ProSpeed.ASM(37) Illegal instruction
    **Error** ProSpeed.ASM(42) Illegal instruction
    Error messages: 2
    Warning messages: None
    Passes: 1
    *

    und die 2 fehler sind immer an der stelle in der ProSpeed.ASM an der RDTSC steht.

    ein pentium mit 200MHz sollte den befehl doch kennen oder?
    ich hab auch schon geschaut ob ich einen switch des TASM noch setzen muss, um 32bit code zu bekommen, hab aber nichts gefunden.

    kann mir bitte jemand helfen?

    und gleich noch eine frage (falls sie im cpu-speed doch jeder überlesen haben sollte...) was sind die unterschiede zwischen asm{}, _asm{} und __asm{} ?
    und wann benutze ich welches?? oder sind das nur unterscheidliche konventionen der hersteller??? denn in der bcc-hilfe stehen _alle 3_ schreibweisen als mögliche syntax drinnen. 😕

    btw: hier das original des ProSpeed Programms (hier aus dem forum)

    #include <iostream.h>
    #include <windows.h>
    #include <conio.h>
    //using namespace std;
    
    DWORD GetMHZ()
        {
        DWORD value1    = 0;
        DWORD value2    = 0;
        DWORD value3    = 0;
        DWORD value4    = 0;
        __asm
            {
            rdtsc
            mov value1, eax
            mov value2, edx
            }
        Sleep(1000);
        __asm
            {
            rdtsc
            mov value3, eax
            mov value4, edx
            }
        value1          = value3 - value1;
        value2          = value4 - value2;
        double MHZ      = (value1+(value2*(2^32)))/1000/1000;
        return (DWORD)MHZ;
        }
    
    int main()
    {
        cout<<"\n\n\n\n\n\n\n\n\n\n                     "<< (int)GetMHZ() << " MHZ"<<endl;
    
      getch();
        return 0;
    }
    


  • Ich weiss nicht ob es dir hilft aber ich habe gerade mal deinen Code durch den MSVC 6 gejagt und es funzt einwandfrei.

    Das einzige was mir dazu einfällt ist das dein Assembler dieses Kommando nicht kennt wie du ja schon vermutet hast. Ich weiss leider auch nicht welchen Befehlsatzt deine Version kennt.

    Joe



  • Ich hatte genau das selbe Problem (aber nicht den Ergeiz es zu lösen *g*).
    Aber es könnte sein, dass mensch den Befehlssatz "erweitern" muss.
    Normalerweise müsste in der *.asm File oben stehen:
    .386
    das sollte mensch vielleich mal ändern auf
    .586
    oder:
    .686

    und mal schauen ob es funzt.
    Normalerweise gehört RDTSC nämlich nicht zum 386 Befehlssatz. Aber ich weiß nicht bis welche Kennung TASM unterstützt.

    mfg
    -bg-



  • Mit dem alten BCC 5.02 funktioniert dieses hier ganz gut:

    #ifdef __BORLANDC__
      #define EMIT   db
    #else
      #define EMIT   __emit
    #endif
    
    UINT64 rdtsc(VOID)
    {
        _asm EMIT 0x0F
        _asm EMIT 0x31
    }
    

    Mit dem Sleep im Code wird die Messung aber fürchterlich ungenau. Da wirst du öfter mal andere Werte zurückbekommen. Zum Vergleich kannst Du Dir ja mal meine Version anschauen. Diese findest Du auf http://www.winapi.de.vu unter Tipps/Tricks.



  • Den bcc32 mit dem Parameter "-6" aufrufen, damit der Compiler Pentium Pro Code erzeugt. Fertig.



  • hurraaaa!
    alles klar und in butter 😉

    mady hat den letzten anstoss gegeben 😉

    ich hab erstmal in den builder optionen die syntax notation auf 'Borland' umgestellt (war vorher auf 'ANSI') und den code für Pentium prozessoren optimieren lassen.

    jetzt klappt alles so wie's soll (hoffe ich mal) mal gucken ob sich das problem mit den pre-compilierten header dateien auch gelöst hat... aber erstmal danke euch allen 😉

    root2

    [ Dieser Beitrag wurde am 18.09.2002 um 21:19 Uhr von root2 editiert. ]


Log in to reply