Das Little-Endian-byte-oder bit-Reihenfolge, in der die x86-Architektur?
Der Titel sagt alles. Ich will wissen, wenn ein x86-Befehl liest Daten aus dem Speicher hat es übersetzt, es bytes oder bits, um die Little-Endian-Reihenfolge. Zum Beispiel, wenn wir die folgenden Daten an der Adresse "0" (Binär) (geschrieben hier im RAW-format, sequental):
01010100 00110010
Und wenn ich lese es folgendermaßen:
mov ax, word [0]
Was wird 'ax' enthalten - "01010100 00110010" oder "00101010 01001100"? Oder übersetzt in ganze Zahl ohne Vorzeichen (angenommen, dass die x86-intiger Anweisungen interpretieren die register sequentiell-Binär-Daten als Big-Endian-Binär-Zahl, die gleiche endian-als Arabische zahlen geschrieben werden) in dezimal - "21554" oder "10828"?
- endian ist in der Regel an den multi-byte-Ebene. Sie sollten sich nicht sorgen zu machen über die bit-Reihenfolge in einem einzigen byte.
- Ich bin mit einem 2-byte-Daten oder ein "Wort", wie Sie sollten bemerkt haben, bevor Sie die Kommentare, aber danke für die Antwort ("endianness ist in der Regel an den multi-byte-Ebene") sowieso.
- Der Prozessor sowohl liest und schreibt diejenigen bits, die Bestellung nie ankommt. Zwar konnten Sie sich nie über die Seite des Eies ankommt, die Programmierer tun universell schreiben das höchstwertige bit auf der linken Seite.
- -1 für null Forschung gezeigt
- Ich denke es ist eine faire Frage für jemand, der weniger erfahrenen. Soweit ich weiß, würde er nur sehen, die Auswirkungen der endian-ness, wenn er anzeigen wurde beiden Registern und Speicher. Er kann nicht wissen, wie es zu tun.
- Ich denke, die Frage zeigt null Forschung (obwohl es kann nützlich sein). Google: "x86-endian" gibt mir als 1. link Wikipedia: Endianness, die sagt "...Die Intel x86 und x86-64-Prozessoren der Baureihe verwenden das little-endian-format, und aus diesem Grund, die little-endian-format ist auch bekannt als die Intel-Konvention...". Zeigt ein Forschungsanstrengungen (auch von jemand, der weniger erfahrenen) aufgeführt ist, als 1. Punkt ("Search and research") in " Hilfe-Zentrum > Wie kann ich bitte eine gute Frage?
Du musst angemeldet sein, um einen Kommentar abzugeben.
1.3.1 Bit-und-Byte-Reihenfolge
x86 ist little-endian.
In den Darstellungen von Datenstrukturen im Speicher, kleinere Adressen erscheinen im unteren Teil der Abbildung; Adressen erhöhen nach oben. Bit-Positionen werden von rechts nach Links nummeriert. Der numerische Wert, der ein gesetztes bit entspricht zwei hoch der bit-position. IA-32-Prozessoren sind "little-endian" - Maschinen; dies bedeutet, dass die bytes
ein Wort sind nummeriert, beginnend mit dem niederwertigsten byte. Abbildung 1-1 illustriert diese Konventionen.
Den Bedingungen endian und endian beziehen sich auf die Konvention zu interpretieren sind die bytes, aus denen ein Daten-Wort, wenn diese bytes sind im Speicher des Rechners gespeichert. In der computing -, Speicher-Häufig speichert binäre Daten, die durch die Organisation es in 8-bit-Einheiten, sogenannten bytes. Beim Lesen oder schreiben einer Daten-Wort, bestehend aus mehreren solcher Einheiten, die Reihenfolge der bytes im Speicher abgelegt, bestimmt die interpretation der Daten in word.
Jedes byte der Daten im Speicher hat seine eigene Adresse. Big-endian-Systeme speichern das höchstwertige byte eines Wortes bei der kleinsten Adresse und das am wenigsten signifikante byte abgelegt ist, die größte Adresse (siehe auch Most significant bit). Little-endian-Systeme hingegen speichern das niederwertigste byte in die kleinsten Adresse.
Die Abbildung rechts zeigt ein Beispiel für die Verwendung der Daten Wort "0A 0B 0C 0D" (set mit 4 bytes, die geschrieben mit Links-nach-rechts-positions -, hexadezimal-notation), und die vier Speicherplätze mit Adressen a, a+1, a+2, a+3; dann, in big-endian-Systemen, byte 0A gespeichert in a, 0B in einem+1, 0C in eine+2 und 0D in a+3. In little-endian-Systemen, ist die Reihenfolge Umgekehrt mit 0D im Speicher gespeicherten Adresse ein, 0C in a+1, 0B in einem+2, 0A in a+3.
So, wie Sie sehen können endianness immer über bytes, um nicht bits.
AFAIK endianness ist nie ein bisschen um, es ist immer eine byte-Reihenfolge, egal für welchen Prozessor.
Das niedrigste bit ist stets als auf der "richtigen" Seite und die höchsten bei der "linken" Seite ein fester Wert steht (sei es 1 -, 2 -, 4-oder 8-byte-Wert), so dass Verschiebungen oder Rotationen um die "richtigen" gehen immer in Richtung des niedrigsten bit-und die "linken" immer nach dem höchsten bit. Dies ist unabhängig von der endianness.
X86 ist little endian, d.h. das niedrigste byte zuerst kommt (also an der niedrigsten Adresse). Dies bedeutet, dass die bytes
0x01
,0x02
,0x03
und0x04
, in dieser Reihenfolge, kann genauso gut gesehen werden wie die 32-bit-Wert0x04030201
, zwei 16 bit-Werte von0x0201
und0x0403
oder 4 einzelne bytes (unter der Annahme, dass Byte sind Bytes, d.h. 8-bit-Werte-es gibt Systeme, wo die bytes noch andere bit Größen, nicht aber die x86).pslldq
) und element Indizierung (pshufd
/shufps
/pblend
...) behandeln Sie die Vektor-Register die gleiche Weise wie die bit-Verschiebungen Behandlung der bits in einem integer-register. Also in den Kommentaren, es ist besser (aber schwieriger zu geben), um zu verfolgen, welche Elemente wo mit notation wie// [ d c b a ]
. Dies ist der Grund, warum_mm_set_epi32(d, c, b, a);
nimmt, seine Argumente in der umgekehrten Reihenfolge ausint arr = {a, b, c, d};
Binary ist ein bisschen langweilig, also habe ich es übersetzt in hex; hoffe, das ist okay.
Die Antwort auf Ihre Frage, in diesem Fall ist, dass Sie 21,554 (in dezimal).
Hier ist, wie Sie feststellen können, dies auf eigene Faust...
Erste, die zwei Byte im Speicher irgendwo, mit der
Equ $
Okay, jetzt mit, dass in Ihrem
.Data
segment, etwas wie dies in Ihrer.Code
segment..Den assembler generiert eine komplette Anleitung für Sie, wie diese...
Öffnen Sie ein debug-Fenster und Ansicht, dass die Speicher-Position (d.h.,
13FE9A002h
)Dort sehen Sie die ersten zwei bytes sind:
32 54
(das sind hex, was nur etwa jeder verwendet)Schritt in die
mov
UnterrichtWerden Sie sehen, dass
AX
enthält dann5432
(in hex, die Ihre dezimal 21,554)