2016-06-23 19 views
0

Ich habe mit gdb gesehen, dass, wenn Bytes aus dem Speicher in Register kopiert werden, sie umgekehrt werden, wenn das verwendete System den Little-Endian-Ansatz annimmt.Operationen und endianess

Da der x86 Assembly-Befehlssatz im besten Fall keine Operationen erlaubt, deren Operanden sich im Speicher befinden, frage ich mich: Gibt es irgendeinen Vorgang, der direkt auf Little Endian-Werten ausgeführt wird, ohne zuerst umgekehrt zu werden?

+0

Sie können zwei Speicheroperanden haben, aber mindestens einer davon muss implizit sein. Siehe zum Beispiel 'push',' pop' oder 'movs'. Ich verstehe den Rest Ihrer Frage nicht oder warum sie 2 Speicheroperanden benötigen würde. Zum Beispiel "add [foo], eax" ist legal und arbeitet mit Speicher. – Jester

+0

Was ich meinte war: Betrachten Sie die Operation add -0x8 (% ebp),% eax. Was es tut, ist, den ersten Wert aus dem Speicher zu holen, ihn umzukehren und ihn dann dem Inhalt von eax hinzuzufügen. Abschließend wird das Ergebnis in eax gespeichert. Meine Frage ist: gibt es irgendeine Operation (neben denen zum Bewegen von Speicher herum), die den Speicheroperanden nicht umkehrt? – badnack

+1

es ist nicht "umgekehrt", es ist im Speicher in der richtigen Reihenfolge und lesen aus dem Speicher in der richtigen Reihenfolge, ls Byte Spur zuerst, ms Byte Spur zuletzt, setzt der Controller die Bytes auf der rechten Byte-Spur, genau wie auf einem großen Endian Maschine setzt die Steuerung die Bytes auf die rechte Byte-Spur. x86 erlaubt nicht ausgerichtet, so dass es noch schlimmer ist, als dass es Bytes nehmen muss, die sich in einer der Spuren befinden, und sie auf die richtige Spur bewegen (entweder auf dem Bus oder innerhalb des Prozessorkerns, abhängig vom Design). –

Antwort

2

Diese Antwort mag den erfahrenen Leuten etwas seltsam vorkommen, aber was der Fragesteller sucht, heißt MOVBE. Es kopiert die Daten wie es ist (!) (In Bezug auf seine Argumente) zu einem Register. Es ist nicht auf allen Architekturen verfügbar, aber immer noch die beste Lösung für dieses spezielle Problem. Also die Antwort auf

Ich frage mich: Gibt es irgendeine Operation, die direkt auf Little Endian-Werte durchgeführt wird, ohne zuerst umgekehrt wird?

ist ja: MOVBE kopiert die Bytes in der erforderlichen Reihenfolge.

+1

Ich glaube, dass die Erfahrung Leute, die versuchen, das zu sagen, nun, 'movbe' ist derjenige, der die Bytes umkehren. Endlichkeit liegt an der internen Verkabelung des Prozessors, natürlich hat Intel keine Transistoren verschwendet, um Wörter umzukehren. Sie scheinen das missverstandene zu verbreiten, dass ein Registerwert die Zahl ist, die zur Anzeige verwendet wird. Wir wissen nicht, wie Register wie RAX geladen wird, alles, was wir wissen ist, dass das Byte bei niedriger Adresse in AL (das Low-Byte) geht und umgekehrt. Wenn AL tatsächlich Bits 56-63 oder Bits 0-7 ist, wissen wir nicht. –