Mit inlineasm MOMCPUNAME in char schreiben
-
Hallo,
Ich möchte mit c++ den Prozessornamen ermitteln und muss daher mit inline assembler die var MOMCPUNAME in eine c++var, wie char oder string schreiben schreiben lassen.
Ich habe es versucht mit:char cpu; __asm("mov %eax,MOMCPUNAME"); __asm("mov _cpu,%eax");
und
char tmp; __asm volatile("MOMCPUNAME" : "=A" (tmp));
beim 1. code erhalte ich:
[Linker Error] undefined reference to `MOMCPUNAME' [Linker Error] undefined reference to `cpu'
und beim 2. :
Assembler messages: `momcpuname'
Oder ist die Variable momcpuname nur per Macroassembler ereichbar?
Vielen Dank schon mal im vorraus.mfg choke
-
"MOMCPUNAME" gibts bei x86-Prozessoren als Assembler-Befehl nicht.
Du musst den Assembler-Befehl CPUID (ab Pentium) mit Steuercode in eax aufrufen.
Also die Referenz von CPUID lesen, das ist der Befehl der Feststellung des Typs der CPU dient.Kleines Beispiel in Intel-Syntax:
#include <iostream> int main() { char vendor_string[13]; vendor_string[12] = 0; __asm xor eax, eax // Steuercode == 0 __asm cpuid // eax == max // max gibt an welchen maximalen Steuercode der Prozessor // vor Aufruf von von cpuid versteht. __asm mov dword ptr vendor_string[0], ebx __asm mov dword ptr vendor_string[4], edx __asm mov dword ptr vendor_string[8], ecx std::cout << vendor_string << std::endl; // bei Pentium wird jetzt "GenuineIntel" ausgegeben // um an mehr Infos zu kommen cpuid mit Steuercode 1 aufrufen // weitere Infos dann z.B. in den Bits 0 bis 11 von EAX. }
MfG
-
Ich nutze wxDev und daher gcc.
deswegen musste ich as etw ändern:char vendor_string[13]; vendor_string[12] = 0; __asm ("xor eax, eax" "cpuid" "mov dword ptr vendor_string[0], ebx" "mov dword ptr vendor_string[4], edx" "mov dword ptr vendor_string[8], ecx"); wxString scpu = vendor_string;
Als fehler kommt nun:
too many memory references for `xor'
aber danke schonmal.
mfg choke
-
Öhm, vielleicht mal ein paar \n-s ans Zeilenende?
asm ("bla\n" "blubb\n");
Hintereinanderstehende Zeichenkettenliterale werden einfach zusammengezogen.
-
__asm ("xor eax, eax\n" "cpuid\n" "mov dword ptr vendor_string[0], ebx\n" "mov dword ptr vendor_string[4], edx\n" "mov dword ptr vendor_string[8], ecx");
ich hab gelesen, dass man bei gnu ein _ vor die non-asm-variable machen muss.
Aber wie soll ch das jetzt machen?!?
so:__asm ("xor eax, eax\n" "cpuid\n" "mov dword ptr _vendor_string[0], ebx\n" "mov dword ptr _vendor_string[4], edx\n" "mov dword ptr _vendor_string[8], ecx");
oder so:
__asm ("xor eax, eax\n" "cpuid\n" "mov _dword ptr vendor_string[0], ebx\n" "mov _dword ptr vendor_string[4], edx\n" "mov _dword ptr vendor_string[8], ecx");
es gibt noch mehr fehler:
C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s: Assembler messages: C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4349: Error: too many memory references for `xor' C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4351: Error: junk `ptr vendor_string[0]' after expression C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4351: Error: too many memory references for `mov' C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4352: Error: junk `ptr vendor_string[4]' after expression C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4352: Error: too many memory references for `mov' C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4353: Error: junk `ptr vendor_string[8]' after expression C:\DOKUME~1\blub\LOKALE~1\Temp/ccoVaaaa.s:4353: Error: too many memory references for `mov'
-
nung gibts weniger Fehler:
__asm ("xor %eax, %eax\n" "cpuid\n" "mov dword ptr vendor_string[0], %ebx\n" "mov dword ptr vendor_string[4], %edx\n" "mov dword ptr vendor_string[8], %ecx");
Fehler:
C:\DOKUME~1\blub\LOKALE~1\Temp/cc21aaaa.s:4351: Error: junk `ptr vendor_string[0]' after expression C:\DOKUME~1\blub\LOKALE~1\Temp/cc21aaaa.s:4352: Error: junk `ptr vendor_string[4]' after expression C:\DOKUME~1\blub\LOKALE~1\Temp/cc21aaaa.s:4353: Error: junk `ptr vendor_string[8]' after expression
-
weiß ja net obs zur allgemeinen Klärung beiträgt, habe mit ASM-Direktiven in C++ äußerst wenig zu tun aber das gibt die F.A.Q. her:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-41479.html
-
Checker&Murckser schrieb:
weiß ja net obs zur allgemeinen Klärung beiträgt, habe mit ASM-Direktiven in C++ äußerst wenig zu tun aber das gibt die F.A.Q. her:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-41479.html
Tut mir leid aber ich rall trotzdem nicht, wie ich mit dem "dword ptr vendor_string[0]" umgehen soll.
Normalerweise müsste ich ja ein _ vor die var setzen.
aer setzt geht das so nict.
scheinbar wegen dem dword ptr und zu sowas hab ich noch kein beispiel gefunden.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
*push*
kann keiner helfen?!?
-
Klar, schau dir die Links in dem verwiesenen FAQ-Eintrag an. Dort wird dir erklärt, wie du den GCC Inline-Assembler benutzen musst. So wie du es machst ist es fundamental falsch.
-
rüdiger schrieb:
Klar, schau dir die Links in dem verwiesenen FAQ-Eintrag an. Dort wird dir erklärt, wie du den GCC Inline-Assembler benutzen musst. So wie du es machst ist es fundamental falsch.
Die meisten sind für linux oder down.
und in den wenigen anderen steht auch nicht, wie ich mit diesem dword ptr umgehe.
-
ob linux oder windows macht ja keinen Unterschied.
-
cpu: opteroN 144
__asm__ __volatile__ ( "cpuid;" : "=a" (vendor_string[0]), "=b" (vendor_string[4]), "=c" (vendor_string[8]));
ausgabe: q
__asm__ __volatile__ ( "cpuid;" : "=b" (vendor_string[0]), "=c" (vendor_string[4]), "=d" (vendor_string[8]));
ausgabe:
__asm__ __volatile__ ( "xor %%eax, %%eax;" "cpuid;" : "=a" (vendor_string[0]), "=b" (vendor_string[4]), "=c" (vendor_string[8]));
ausgabe: ■
__asm__ __volatile__ ( "xor %%eax, %%eax;" "cpuid;" : "=b" (vendor_string[0]), "=c" (vendor_string[4]), "=d" (vendor_string[8]));
ausgabe: A
-
*push*
Bitte helft mal es funzt doch schon fast.
-
wo muss das dword hin?
-
*push*
-
*push* -.-