(gelöst)[x86] CPU Brand String ASCII oder ANSI?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Krishty »

Hi,

Ist der CPU Brand String – also das, was CPUID für 0x80000002 bis 0x80000004 zurückgibt – ASCII oder ANSI? Ich finde überall widersprüchliche Angaben :/

Gruß, Ky

Nachtrag: Ich halte mich einfach mal an Intels Spezifikation, und die sagt: ASCII. Wer mal den CPU-Namen herausfinden muss (Achtung, Visual C++-exklusiv):

Code: Alles auswählen

#include <intrin.h> // '__cpuid' intrinsic

typedef int CSignedInteger4Bytes;
typedef unsigned int CUnsignedInteger4Bytes;
typedef char CASCIICharacter;
#include <string>
typedef ::std::string CASCIIString;

//--------------------------------------------------------------------------------------------------------------------------
// Returns the current CPU's brand string (e.g. "Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz").
// If the CPU doesn't support this feature (< Pentium IV), "unknown" is returned.
//--------------------------------------------------------------------------------------------------------------------------
CASCIIString CPUBrand() {
	// This function uses the 'CPUID' instruction via intrinsic to retrieve the CPU's built-in brand string.
	// For the '__cpuid' intrinsic and an explanation of its parameters, see http://msdn.microsoft.com/library/hskdteyh.

	// First, it is determined whether the CPU supports extended CPUID functions by checking if 0x80000000 returns a higher
	//	value in EAX. If it does, the values 0x80000002 through 0x80000004 can be used to retrieve the brand string[1].
	CSignedInteger4Bytes eaxEbxEcxEdx[4];
	__cpuid(eaxEbxEcxEdx, 0x80000000);
	// consider: '__cpuid' expects signed 4-byte values, but 0x80000000 is unsigned
	if(0x80000000u < CUnsignedInteger4Bytes(eaxEbxEcxEdx[0])) {

		// The brand string itself is an ASCII string with a maximum length of 47 characters; with 4 characters stored in
		//	EAX, EBX, ECX and EDX each, for three CPUID calls[2].
		union {
			CASCIICharacter			characters[48];
			CSignedInteger4Bytes	registers[4 * 3];
		} processorBrandString;

		__cpuid(processorBrandString.registers    , 0x80000002);
		__cpuid(processorBrandString.registers + 4, 0x80000003);
		__cpuid(processorBrandString.registers + 8, 0x80000004);

		return CASCIIString(processorBrandString.characters);
	} else
		return CASCIIString("unknown");

	// [1] "Intel® Processor Identification and the CPUID Instruction", May 2002, Order Number: 241618-021, pg. 21:
	//		"To determine if the brand string is supported on a processor, software must follow the step below:
	//			1. Execute the CPUID instruction with EAX=80000000h
	//			2. If ((returned value in EAX) > 80000000h) then the processor supports the extended CPUID functions and EAX
	//				contains the largest extended function supported.
	//			3. The processor brand string feature is supported if EAX > 80000000"
	// [2] "Intel® Processor Identification and the CPUID Instruction", May 2002, Order Number: 241618-021, pg. 21:
	//		"The brand/frequency string is defined to be 48 characters long, 47 bytes will contain characters and the 48th
	//		byte is defined to be NULL (0). A processor may return less than the 47 ASCII characters as long as the string
	//		is null terminated and the processor returns valid data when CPUID is executed with EAX = 80000002h, 80000003h
	//		and 80000004h."
}
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von joggel »

Hach Ky,

schön das Du dir selber helfen kannst...
Warum bewegst Du dich auch immer in Spheren, die kaum ein Mensch zuvor betreten hat??!!
Und vorallem in was für Zeiten... 3:40 !!
Vlt. sollte sich ZFX über mehrere Zeitzonen etablieren, damit die Channce höher ist um solche Zeiten Antworten zu bekommen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Krishty »

joggel hat geschrieben:Warum bewegst Du dich auch immer in Spheren, die kaum ein Mensch zuvor betreten hat??!!
Ach komm, selbst Wikipedia hat Beispielquelltext dafür – wenn auch in Assembler. Ich nehme es wohl nur ein bisschen genauer als die Deppen, die sowas dokumentieren und dabei ASCII mit ANSI durcheinanderschmeißen und es damit allen schwermachen, die keine ANSI-Strings in ihrem Framework haben.
joggel hat geschrieben:Und vorallem in was für Zeiten... 3:40 !!
Naja … vllt saß ich da ja in Lakefront, Chicago; hatte 20:40 CST und konnte dank ekligstem Nieselregen nichts anderes machen als zu trinken und zu programmieren? ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von joggel »

Nur eine Frage...
Wozu brauchst du das?
Und auf der verlinkten Wikipedia-Seite steht doch, dass der String als ASCII zurückgegeben wird...

Gruß
Benutzeravatar
kimmi
Moderator
Beiträge: 1412
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von kimmi »

Und was machst du in Chicago?

Gruß Kimmi
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Krishty »

joggel hat geschrieben:Wozu brauchst du das?
CPU des Zielsystems einigermaßen identifizieren
joggel hat geschrieben:Und auf der verlinkten Wikipedia-Seite steht doch, dass der String als ASCII zurückgegeben wird...
Ja, aber
  1. ist Wikipedia nicht meine erste Anlaufstelle, wenn ich Mnemonics nachschlage
  2. nennt die MSDN das String-Format nicht (und der Beispieltext nutzt auch die falsche Länge von 64 Zeichen)
  3. bin ich auf der Suche danach erst woanders gelandet, wo von ANSI die Rede war
  4. gibt der Wikipedia-Artikel keine Quelle für seine ASCII-Behauptung an (was ihn genau so unzuverlässig macht wie alle anderen Suchergebnisse auch; das werde ich aber nun korrigieren)
Kurz: Da draußen kann man niemandem trauen, außer eben den Wegweisern der Hersteller :)
Chromanoid hat geschrieben:Der Herr hat gescherzt ^^
:)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4286
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Chromanoid »

Krishty hat geschrieben:
Chromanoid hat geschrieben:Der Herr hat gescherzt ^^
:)
hehehe da hatte ich meinen post auch schon wieder gelöscht... wollte dir nicht die gelegenheit nehmen eine interessante geschichte aufzutischen ^^
joggel

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von joggel »

Krishty hat geschrieben: CPU des Zielsystems einigermaßen identifizieren
Ich frage jetzt mal nicht weiter, was Du genau vorhast..
gibt der Wikipedia-Artikel keine Quelle für seine ASCII-Behauptung an (was ihn genau so unzuverlässig macht wie alle anderen Suchergebnisse auch; das werde ich aber nun korrigieren)
Jo, finde ich toll, das Du das korrigieren willst.
Aber, wieso wettern so viele gegen Wikipedia.
Ich verstehe das nicht. Wikipedia hat mir schon oft aus der Patsche geholfen!
Klar, um jetzt tiefer in eine bestimmte Materie nachzuforschen, ist Wikipedia nicht geeignet, aber vermittelt einen schon einen groben Überblick!
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Krishty »

Ich wettere ja garnicht dagegen – ich traue ihr einfach weder mehr noch weniger als anderen Seiten. Und da es auf allen anderen nach purer Willkür aussah, ob der Befehl ASCII oder ANSI liefert, und Wikipedia keine Quelle dafür angegeben hat, habe ich ihr in diesem Fall eben nicht getraut.

Ich merke btw auch gerade, dass ich echt beschissen in sowas bin … hatte direkt einen falschen Link reingehauen und weiß nicht, wie man an Diskussionen teilnimmt. Na, dann müssen die eben ohne mich auskommen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von joggel »

Nee, ich meine ja nicht dich damit...
Meinte ich nur mal so allgemein!
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Aramis »

CPU des Zielsystems einigermaßen identifizieren
Womit die Frage nach der Zeichenkodierung ad absurdum gefuehrt wurd. Identifikation des Zielsystems setzt ja Kenntnis des entsprechenden Brand-Strings eines Herstellers voraus, ergo auch Kenntnis des verwendeten Zeichensatzes beziehungsweise des kleinsten Zeichensatzes, der in der Lage ist, den Brand-String abzubilden. Bei GenuineIntel und AuthenticAmd zudem ein ziemlich eindeutiges ASCII ;-)

Wolltest du also deinem Ideal getreu bleiben, waere das vielleicht der richtige Punkt um einen UnspecifiedByteString-Datentyp einzufuehren. Wenn du die damit zu vergleichenden Brand-Strings in demselben Typ vorhaelst, hast du Perfektion erreicht. So ist es nur unnuetzer Schrott. Auf, ab ans Reissbrett.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Krishty »

Aramis hat geschrieben:
CPU des Zielsystems einigermaßen identifizieren
Womit die Frage nach der Zeichenkodierung ad absurdum gefuehrt wurd. Identifikation des Zielsystems setzt ja Kenntnis des entsprechenden Brand-Strings eines Herstellers voraus, ergo auch Kenntnis des verwendeten Zeichensatzes beziehungsweise des kleinsten Zeichensatzes, der in der Lage ist, den Brand-String abzubilden. Bei GenuineIntel und AuthenticAmd zudem ein ziemlich eindeutiges ASCII ;-)
Entschuldige; „identifizieren“ ist zu verschwommen – „Namen der CPU in die Log-Datei schreiben“ kommt da schon eher dran. Das Programm selber vergleicht keine bekannten Strings und kennt sie auch nicht; allerdings müsste ich alles, was nicht ASCII und UTF-8 ist, vorbehandeln, weil es es sonst nicht in die Log-Datei schaffen würde. (Man darf Features und alles weitere, wofür man eine CPU identifizieren wollen sollte, ja garnicht über den Namen bestimmen, sondern nur über entsprechende Flags.)
Aramis hat geschrieben:Wolltest du also deinem Ideal getreu bleiben, waere das vielleicht der richtige Punkt um einen UnspecifiedByteString-Datentyp einzufuehren. Wenn du die damit zu vergleichenden Brand-Strings in demselben Typ vorhaelst, hast du Perfektion erreicht. So ist es nur unnuetzer Schrott. Auf, ab ans Reissbrett.
Cric::IMemory, landläufig auch Binary Large Object genannt :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Aramis »

Moment, es gibt einen semantischen Unterschied zwischen einem Text-String mit unspezifiziertem Encoding und einem Blob :-) Ist ja wie als ob du eine 100 Tonnen schwere sowjetische Rakete unbekannter Bauart pauschal unter 'Schrott' einstufen wuerdest.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Krishty »

Aramis hat geschrieben:Moment, es gibt einen semantischen Unterschied zwischen einem Text-String mit unspezifiziertem Encoding und einem Blob :-)
Da fiele mir nichts außer dem Nullmarker ein, aber Pascal-artige Strings rocken eh viel mehr!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von eXile »

Mal was anderes aus dem ersten Post:

Code: Alles auswählen

<!-- m --><a class="postlink" href="http://msdn.microsoft.com/library/hskdteyh">http://msdn.microsoft.com/library/hskdteyh</a><!-- m -->.
Liegt das an der Forensoftware, oder weil Krishty das so aus Visual Studio (eventuell mit weiteren Add-Ins) kopiert hat?
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Beitrag von Krishty »

Forensoftware

Genau wie das irreversible Aufblähen von Tabs auf acht Leerzeichen
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten