2015-04-23 8 views
5

Beim Lernen x86-64 Assembly stieß ich auf meine erste Inkompatibilität zwischen Intel 64 und AMD64-Implementierungen von "x86-64": Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit?syscall ist im Kompatibilitätsmodus der einen, nicht aber der anderen gültig.Was ist die kompatible Teilmenge der x86-64-Implementierungen von Intel und AMD?

Gibt es eine bessere Möglichkeit, diese Inkompatibilitäten zu finden, außer beide Handbücher sorgfältig zu lesen und sie zu vergleichen, was fehleranfällig ist und meinen manuellen Leseaufwand verdoppelt, wenn ich nach Portabilität strebe?

Zum Beispiel wäre es viel einfacher, wenn es entweder:

  • eine Standard-Untergruppe, die sowohl Intel und AMD Anspruch
  • Kommentaren auf dem Intel-Handbuch über AMD Kompatibilität zu folgen, da AMD derjenige war erfinden x86-64. Aber das wäre für Intel natürlich schwierig, und die Intel-Handbücher enthalten das Wort AMD nicht.
  • einige allgemeine offizielle oder nicht offizielle Richtlinien, die die Kompatibilität bestimmter Teile gewährleisten. Zum Beispiel, etwas wie: Kompatibilitätsmodus möglicherweise nicht kompatibel, aber 64-Bit-Modus nicht.
  • einig gepflegte Liste von Inkompatibilitäten von Intel, AMD oder einem Dritten
+2

Wie ausgeführt wird, , [Wikipedia] (http://en.wikipedia.org/wiki/X86-64#Differences_between_AMD64_and_Intel_64) ist ein guter Anfang! – RaGe

+0

@RaGe Sie haben Recht, und ich fühle mich albern :-) –

Antwort

5

Geschichte Anmerkung: Intel implementiert ihre 64-Bit-ISA, die sie IA-64, das war ein vollständiger Ersatz des 32-Bit genannt x86 ISA, in ihrer Itanium-Reihe von Prozessoren. IA-64 war nicht abwärtskompatibel zu x86 und wurde außerhalb des High-End-Servermarktes nie wirklich populär.

AMD erstellt die AMD64 ISA als eine inkrementelle Evolution über die x86 ISA. AMD64 gewann Popularität und Akzeptanz schnell und Intel nahm es auch an, aber nannte es zu verschiedenen Zeiten IA-32e, EM64T und Intel64. Intel64 und AMD64 sind nahezu identisch mit einigen Unterschieden.

Wikipedia listet diese Unterschiede:

  • Intel 64 des BSF und BSR Anweisungen handeln anders als AMD64 ist, wenn die Quelle Null ist und die Operandengröße ist 32 Bit. Der Prozessor setzt das Null-Flag und lässt die oberen 32 Bits des Ziels undefiniert.

  • AMD64 benötigt ein anderes Microcode-Update-Format und steuert MSRs (modellspezifische Register), während Intel 64 Microcode-Updates unverändert von ihren 32-Bit-Prozessoren implementiert.

  • Intel 64 fehlen einige MSRs, die in AMD64 als architektonisch betrachtet werden. Dazu gehören SYSCFG, TOP_MEM und TOP_MEM2.

  • Intel 64 erlaubt SYSCALL/SYSRET nur im 64-Bit-Modus (nicht im Kompatibilitätsmodus) und erlaubt SYSENTER/SYSEXIT in beiden Modi. AMD64 fehlt SYSENTER/SYSEXIT in beiden Untermodi des langen Modus.

  • Im 64-Bit-Modus verhalten sich Verzweigungen mit dem Präfix 66H (Operand Size Override) unterschiedlich. Intel 64 ignoriert dieses Präfix: Der Befehl hat einen 32-Bit-Vorzeichen-erweiterten Offset, und der Befehlszeiger ist nicht abgeschnitten. AMD64 verwendet ein 16-Bit-Offsetfeld in der Anweisung und löscht die obersten 48 Bits des Befehlszeigers.

  • AMD-Prozessoren erhöhen einen Floating-Point Ungültige Ausnahme, wenn ein FLD oder FSTP eines 80-Bit-Signalisierungs-NaN ausgeführt wird, während Intel-Prozessoren dies nicht tun.

  • Intel 64 fehlt die Möglichkeit, eine reduzierte (und somit schnellere) Version des Gleitkommazustands zu speichern und wiederherzustellen (einschließlich der FXSAVE- und FXRSTOR-Anweisungen).

  • Aktuelle AMD64-Prozessoren haben die begrenzte Unterstützung für die Segmentierung über das LMSLE-Bit (Long Mode Segment Limit Enable) wieder eingeführt, um die Virtualisierung von 64-Bit-Gästen zu erleichtern.

  • Bei Anschluss an eine nicht-kanonische Adresse Rückkehr SYSRET verwenden, führen AMD64 Prozessoren die allgemeine Schutzverletzung Handler in Berechtigungsstufe 3, während auf Intel 64 Prozessoren immer in Berechtigungsstufe 0.

+2

Sie haben Ihre Geschichte rückwärts: IA64/Itanium (was völlig anders ist als IA32/x86) älter AMD64. (Intel hatte ursprünglich nicht vor, dass x86-CPUs in ihre hochpreisige 64-Bit-Serverlinie einfror). – ninjalj

+0

@ninjalj Sie haben Recht. Festsetzung. – RaGe