Autor Thema: Inline ASM in g++  (Gelesen 5862 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« 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:
Zitat
cpuid.cpp:(.text+0x12): undefined reference to `cpuidstring'
collect2: ld returned 1 exit status

Bitte um Hilfe. thx

bitmaster
In the Future everyone will need OS-64!!!

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. December 2008, 08:17 »
Hi,

ich bin mir nicht sicher, aber ich glaub es müsste so aussehen:
asm ("mov $0x80000002,%eax;"
     "cpuid;"
     "mov %eax":"m"(cpuidstring));
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. December 2008, 10:35 »
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)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #3 am: 12. December 2008, 15:20 »
Hmm g++ sagt mir dann

Zitat
cpuid.cpp: In function ‘int main()’:
cpuid.cpp:10: error: invalid 'asm': operand number missing after %-letter

bitmaster
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 12. December 2008, 15:55 »
Meine Variante funktioniert, wenn man die fehlende Klammer ergänzt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 12. December 2008, 16:57 »
Meine Variante funktioniert, wenn man die fehlende Klammer ergänzt.
Also bei mir sagt g++ dann das oben genannte.
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 19. December 2008, 00:38 »
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
In the Future everyone will need OS-64!!!

 

Einloggen