Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 12. December 2008, 08:08

Titel: Inline ASM in g++
Beitrag 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:
Zitat
cpuid.cpp:(.text+0x12): undefined reference to `cpuidstring'
collect2: ld returned 1 exit status

Bitte um Hilfe. thx

bitmaster
Titel: Re: Inline ASM in g++
Beitrag von: rizor 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));
Titel: Re: Inline ASM in g++
Beitrag von: kevin 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)
Titel: Re: Inline ASM in g++
Beitrag von: bitmaster 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
Titel: Re: Inline ASM in g++
Beitrag von: kevin am 12. December 2008, 15:55
Meine Variante funktioniert, wenn man die fehlende Klammer ergänzt.
Titel: Re: Inline ASM in g++
Beitrag von: bitmaster 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.
Titel: Re: Inline ASM in g++
Beitrag von: bitmaster 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