09. september 2002 - 12:19Der er
7 kommentarer og 1 løsning
_emit
jeg har i flere tilfælde stødt på følgende kode til at få fat på Read Time Stamp Counter (RDTSC) men jeg forstår det ikke: _asm _emit 0x0F _asm _emit 0x31
Hvad betyder _emit og hvad gør den helt eksakt ? Er det en msvc++ only instruktion - hvad kan jeg "oversætte" den til hvis det skal virke med g++ ?
The _emit pseudoinstruction is similar to the DB directive of MASM. You use _emit to define a single immediate byte at the current location in the current text segment. However, _emit can define only one byte at a time, and it can only define bytes in the text segment. It uses the same syntax as the INT instruction.
Ad 1) _emit - hvad betyder det ? _emit svarer til ASM instruktionen DB (DataByte ?), dvs. den "kyler" den værdi du skriver efter _emit direkte ned i assembler koden, der hvor du har skrevet det. Ovenstående giver derfor følgende assembler kode:
DB 0F DB 31 MOV :000000, EAX MOV :000004, EDX
hvis vi nu antager at start-variablen ligger som den første variabel i data-segmentet. EA og ED er to af Intel CPU'ens registre - hvad der er i dem afhænger sikkert af hvad de foregående sætninger har haft gang i - alternativt indeholder de simpelthen på 0x0F og 0x31. (Det ved jeg ikke nok om assembler til at kunne afgøre.) Anyway så gemmes værdien i start og start + 4 bytes, med 32 bit integers, så var det vel meningen det skulle være stop.
Den enden gang det udføres giver for mig at se ikke megen mening - jeg ville forvente at stop + 4 bytes ville blive til nCtr.
Jeg tror personligt at der er noget galt med disse instruktioner - de giver for mig at se ingen mening. Følgende ville give mening:
_asm MOV start, eax _asm MOV stop, edx
og senere
_asm MOV eax, START _asm MOV edx, STOP
Ad 2)MVC instruktion only Det er muligt at din g++ compiler ikke forstår _emit og dermed at den er MVC specifik. MEN ... det vigtige er at du jo laver assembler, dvs. maskinsprogsinstruktioner mod en Intel CPU - det vil jo ikke nødvendigvis fungere på en hvilken som helt Unix eller Linux maskine, hvis "hårdvaren" nedenunder ikke er Intel x86 compatibel.
ad "ad 2") det er g++'s syntaks med hensyn til asm jeg ikke kan hitte udaf. jeg bruger g++ med windows da jeg ikke har råd til msvc++ (og ikke ønsker at bruge piratting).
jeg har selv haft problemer med at finde eksempler der giver cpu speed, så derfor vil jeg lige poste et eks. der fungerer med mingw compileren - det kunne jo være andre kunne bruge det: #include <windows.h> #include <stdio.h>
int cpuspeed() { __int64 start; __int64 stop; __int64 freq; __int64 count; __int64 countStop; int total;
//Read Time Stamp Counter (RDTSC) //RDTSC reads a Pentium internal 64 bit register which is being incremented //from 0000 0000 0000 0000 at every CPU internal clockcycle. asm (".byte 0x0f, 0x31" : "=A" (start));
int main(int argc, char **argv) { printf("cpu speed is %iMHz", cpuspeed());
return 0; }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.