PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Borland C++ und Assembler-Code => CPU Type auslesen


dav133
2006-01-11, 01:41:52
ntag,

ich weiß jetzt nicht, in wie weit ihr Vorkenntnisse darin habt, deswegen leg ich einfach mal los.

Ich hab diesen (http://www.c-plusplus.de/forum/viewtopic-var-t-is-38949-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html) Tipp befolgt und mein Borland meckert über nen Assemblerfehler 8002. Soweit kein Problem, hab ich mit #pragma option -w-asc (http://www.tek-tips.com/viewthread.cfm?qid=389589) behoben. Die TASM32.exe liegt im /Bin dir (V.5), also müsste eigentlich alles stimmen. Nur beim Codeausführen passiert garnix (getch ist drin, keine Angst ;) )... Auf DevC++ hab ich keine Lust (kann es auch nicht). Wenn ich den pragma wieder rausnehme, dann bemängelt er "rdtsc" in der unit1.asm... ka. Vllt. hatte jemand ja schonmal rein zufällig das selbe Problem und kann mir helfen, obwohl ich eigentlich fest davon ausgehe keine Antworten zu bekommen.

Achja, Hilfe und Google hab ich stundenlang gequält.

lg

zeckensack
2006-01-11, 01:46:14
Nur beim Codeausführen passiert garnix (getch ist drin, keine Angst ;) )Welcher Code? Wo? Zeigen! =)

dav133
2006-01-11, 01:52:44
Welcher Code? Wo? Zeigen! =)

#include <iostream>
#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 << (int)GetMHZ() << " MHZ"<<endl;
getch();
return 0;
}
war auch verlinkt.

lg

/edit: Wenns ne andere Möglichkeit dazu gibt, immer her damit. Das (http://www.sandpile.org/ia32/cpuid.htm) wird auch öfters verlinkt, weiß aber nix so recht damit anzufangen. Dabei will ich einfach nur die Taktfrequenz ;(.

/edit2:

Sieht auch interessant aus, leider mal wieder mein Assembler-Lieblings-Problem (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=6609&lngWId=3).

lg

zeckensack
2006-01-11, 08:08:08
1)
^ ist in C der XOR-Operator. Statt 2^32 (was btw exakt 30 ist), müsste es 1<<32 lauten. Aber auch das wird nicht funktionieren, weil niemand den Compiler zwingen kann mehr als ein int dafür zu nehmen, und 1<<32 lässt sich als int halt nicht darstellen.

Nimm einfach pow(2,32). Es schadet garnichts dass das ein double ist. Dafür brauchst du noch #include <math.h>. Oder gleich ausrechnen und hinschreiben (4294967296.0).

2)
Wofür die ganzen DWORDs? DWORD gibt's in nacktem C oder C++ garnicht, die komischen Windows-Header definieren das als unsigned long (Unsitte, weil =unsigned int). Das kann man auch direkt haben. Andererseits castest du von double nach DWORD, und schlussendlich (in main) zu int. IMO kann das durchaus ein double bleiben, dann kannst du dir zudem noch die Division schenken.

3)
Was heißt jetzt genau "passiert garnix"? Irgendwas muss das Programm doch ausgeben.

dav133
2006-01-11, 18:17:31
1)
^ ist in C der XOR-Operator. Statt 2^32 (was btw exakt 30 ist), müsste es 1<<32 lauten. Aber auch das wird nicht funktionieren, weil niemand den Compiler zwingen kann mehr als ein int dafür zu nehmen, und 1<<32 lässt sich als int halt nicht darstellen.

Nimm einfach pow(2,32). Es schadet garnichts dass das ein double ist. Dafür brauchst du noch #include <math.h>. Oder gleich ausrechnen und hinschreiben (4294967296.0).

2)
Wofür die ganzen DWORDs? DWORD gibt's in nacktem C oder C++ garnicht, die komischen Windows-Header definieren das als unsigned long (Unsitte, weil =unsigned int). Das kann man auch direkt haben. Andererseits castest du von double nach DWORD, und schlussendlich (in main) zu int. IMO kann das durchaus ein double bleiben, dann kannst du dir zudem noch die Division schenken.

3)
Was heißt jetzt genau "passiert garnix"? Irgendwas muss das Programm doch ausgeben.Hab den Code einfach so ohne genauere Analyse kopiert, da meine C++ Kenntnisse noch nicht so toll währen, als dass ich es selbst schreiben könnte. Ich hab den Code von beschriebenem Link im cpp-Board. Er bleibt bei der Fehlermeldung "W8002 Restarting compile using assembly" stecken.

/edit:

Hmm, also das mit dem #pragma option -w -asc blendet einfach nur die Fehlermeldung aus, daher kann ichs auch gleich lassen.

Wenn ich die Fehlermeldung mit pragma wegmache, bemängelt er den Befehl "rdtsc" in der Unit1.asm (die wohl automatisch generiert wird).

lg

ScottManDeath
2006-01-11, 20:11:03
Da kennt Dein moderner Borland Compiler anscheinend die Befehssätze >= Pentium nicht, dort wo u.A. der RDTSC Befehl definiert ist.Du kannst Dir aber den Opcode des RDTSC raussuchen und dann mit emit oä. direkt in den Code einfügen.

dav133
2006-01-11, 20:26:55
Da kennt Dein moderner Borland Compiler anscheinend die Befehssätze >= Pentium nicht, dort wo u.A. der RDTSC Befehl definiert ist.Du kannst Dir aber den Opcode des RDTSC raussuchen und dann mit emit oä. direkt in den Code einfügen.
http://img50.imageshack.us/img50/2407/gg4gs.th.gif (http://img50.imageshack.us/my.php?image=gg4gs.gif)

Hmm, der frischste is mein Borland auch nicht mehr. Kannst du das mit dem emit noch mal etwas präzisieren?

lg

Gast
2006-01-11, 23:27:26
Hmm, also das mit dem #pragma option -w -asc blendet einfach nur die Fehlermeldung aus, daher kann ichs auch gleich lassen.Was soll das denn nun heißen?
Wird ein Programm erzeugt? Ich nehme mal an ja, weil du einen Screenshot vom laufenden Debugger gezeigt hast. Also was genau passiert wenn du das Programm startest (ohne Debugger)?

ScottManDeath
2006-01-12, 01:13:45
Du fügst die opcodes entweder mit DB direkt in den Code ein, oder mit dem, was der BC++ kann. Im VS ist es __emit oder sowas

...
__emit 0x04 __emit 0x66 ; maschinencode für einen Befehl
....