Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 12. December 2008, 08:08
-
Hi,
ich möchte in meiner C++ Anwendung cpuid benutzen. Das geht ja mittels inline asm. Nur kenne ich mich da noch nicht wirklich so gut aus. Irgendwie bekomme ich das nicht hin. Evtl. könnt ihr mir ja helfen. Hier der Code:
#include <iostream>
#include <ostream>
int main()
{
char cpuidstring[48];
asm ("mov $0x80000002,%eax;"
"cpuid;"
"mov %eax,(cpuidstring)"); /* hier scheint was nicht zu stimmen */
std::cout << cpuidstring;
}
Ist die Deklaration von cpuidstring überhaupt richtig? Ich will ein 48 Byte großes Array anlegen, in dem ich die cpuid speichern kann. ALso g++ sagt immer:
cpuid.cpp:(.text+0x12): undefined reference to `cpuidstring'
collect2: ld returned 1 exit status
Bitte um Hilfe. thx
bitmaster
-
Hi,
ich bin mir nicht sicher, aber ich glaub es müsste so aussehen:
asm ("mov $0x80000002,%eax;"
"cpuid;"
"mov %eax":"m"(cpuidstring));
-
Erstmal: http://lowlevel.brainsware.org/wiki/index.php/Inline-Assembler_mit_GCC
Die Variante von rizor haut nicht ganz hin, eher sowas:
asm("mov $0x80000002, %%eax;"
"cpuid; "
: "=a" (cpuidstring[0]), "=b" (cpuidstring[4]), "=c" (cpuidstring[8], "=d" (cpuidstring[12]));
(Nicht ausprobiert - ich kenne cpuid nicht wirklich gut - aber ich denke, wie man den Inlineassembler einsetzt wird klar)
-
Hmm g++ sagt mir dann
cpuid.cpp: In function ‘int main()’:
cpuid.cpp:10: error: invalid 'asm': operand number missing after %-letter
bitmaster
-
Meine Variante funktioniert, wenn man die fehlende Klammer ergänzt.
-
Meine Variante funktioniert, wenn man die fehlende Klammer ergänzt.
Also bei mir sagt g++ dann das oben genannte.
-
So, habe jetzt mal die wenige Zeit die mir zur verfügung steht ausgenutzt und mich wieder ran gemacht. Und siehe da, ich habe die Lösung gefunden. Es funktioniert so:
asm("mov %%eax,%0" : "=m" (cpuidstring[0]));
Vielen dank euch