PC-Architektur feststellen
-
Hallo,
welche Möglichkeiten bietet mir C auf Betriebssystemebene die Architektur zu bestimmen, also ob es ein PPC, ne Alpha oder aber eben Intel ist?
Gruß
Björn
-
Hi !
In reinem C ist mir kein Weg bekannt um das rauszufinden. Googel aber mal was nach einem Tool das dir Infos über die CPU liefert. Da wird auch der Prozessortyp mit angegeben. Das Programm ist in Assembler geschrieben, ob dir das hilft weiß ich aber nich..
Btw, mit welchem OS arbeitest du denn ? Ich schätze mal Unix, oder ?
-
Entwicklungsplattformen sind Windows und Linux, aber da fast alle meine Programme portabel sind, bin ich jetzt auf Hindernisse gestoßen, wenn die Software auf nicht-Intel Architekturen gebaut wird.
Da gibt es Probleme mit longs und shorts, das ist ganz übel, denn PPC und Alpha haben das MSB (most significant bit) am Ende einer Byte-Kette und Intel am Anfang.
Nun will ich eine Routine schreiben, die die Bits neu sortiert, wenn es sich um ne nicht-Intel Architektur handelt. Dafür muss ich aber wissen, auf welcher Architektur mein Programm gerade läuft.Übrigens, es führt kein Weg daran vorbei longs und shorts in dem Programm zu nutzen, nur um sämtliche Diskussionen darüber sofort im Keim zu ersticken
-
Dafür hat hier jemand mal einen Trick vorgestellt... suche mal unter "C" (oder auch "C++") nach Endian, ob der Beitrag noch da ist.
Die Idee lief ungefähr so:
Einen Union mit Bytezugriff anlegen, Adresse von long/short mit einer eindeutigen Signatur (z.B. 0x80402010) auf einen Unionptr casten. Nun kann man die Bytes über die Union auslesen. Damit hat man die Ordnung im Speicher. Dann bestimmt man die arithmetische Ordnung, d.h. man maskiert Bytes aus - z.B. Zahl & 0x0FF usw. Damit bekommt man das arithmetische Byte 0. Je nachdem ob nun Union.Byte0 und arithmetisches Byte 0 übereinstimmen kann man ermitteln, ob es sich um Big oder Little Endian handelt.
-
Ach ja, ich vergaß, es muss nicht ANSI C sein, sondern können auch Kernel Header sein, so wie man sie auch zur hardwarenahen Programmierung einsetzt.
-
Warum so kompliziert?
int test = 1; if (*(char*)(&test)==1) little endian! else big endian!
hier wird vorausgesetzt dass sizeof(int) > sizeof(char) = 1 byte
-
Bei solchem Code geistert einigen paranoiden Programmieren der Gedanke vom sagenumwobenen Integer-Padding im Kopf herum :).
Ausserdem soll es auch Maschinen geben, die weder Little- noch Big-Endian nutzen. Der Spaß nennt sich Middle-Endian und existiert praktisch nur noch im Jargon-File ;).PS: unsigned char, wenn schon, auch wenn die clc-FAQ anderes behauptet.
[ Dieser Beitrag wurde am 06.12.2002 um 15:13 Uhr von Daniel E. editiert. ]
-
mal htonl, htons usw. angucken
-
Vielleicht hilft dir dieser Link ?
-
Danke für die vielen Infos, werde jetzt zusehen, dass ich das irgendwie mit den hier gegebenen Tipps hinbiege.