Endianness

HistoryEdit

De nombreux processeurs historiques et existants utilisent une représentation mémoire big-endian, soit exclusivement, soit comme option de conception. La représentation mémoire big-endian est communément appelée ordre réseau, tel qu’utilisé dans la suite de protocoles Internet. D’autres types de processeurs utilisent la représentation mémoire little-endian ; d’autres encore utilisent un autre schéma appelé « middle-endian », « mixed-endian » ou « PDP-11-endian ».

Le System/360 d’IBM utilise l’ordre des octets big-endian, tout comme ses successeurs System/370, ESA/390 et z/Architecture. Le PDP-10 utilise également l’adressage big-endian pour les instructions orientées octet. Le mini-ordinateur IBM Series/1 utilise également l’ordre big-endian des octets.

Le traitement de données d’endianness différentes est parfois appelé le problème NUXI. Cette terminologie fait allusion aux conflits d’ordre des octets rencontrés lors de l’adaptation d’UNIX, qui tournait sur le PDP-11 à endive mixte, à un ordinateur IBM Series/1 à endive grande. UNIX a été l’un des premiers systèmes à permettre de compiler le même code pour des plates-formes ayant des représentations internes différentes. Un des premiers programmes convertis était censé imprimer Unix, mais sur le Series/1, il imprimait nUxi à la place.

Le Datapoint 2200 utilise une logique bit-série simple avec little-endian pour faciliter la propagation des reports. Lorsqu’Intel a développé le microprocesseur 8008 pour Datapoint, ils ont utilisé little-endian pour des raisons de compatibilité. Cependant, comme Intel n’a pas pu livrer le 8008 à temps, Datapoint a utilisé un équivalent à intégration moyenne, mais le little-endian a été conservé dans la plupart des conceptions Intel, y compris le MCS-48 et le 8086 et ses successeurs x86. Le DEC Alpha, l’Atmel AVR, le VAX, la famille MOS Technology 6502 (y compris le Western Design Center 65802 et le 65C816), le Zilog Z80 (y compris le Z180 et l’eZ80), l’Altera Nios II, et de nombreux autres processeurs et familles de processeurs sont également little-endian.

Les séries de processeurs Motorola 6800 / 6801, le 6809 et le 68000 utilisaient le format big-endian.

L’Intel 8051, contrairement aux autres processeurs Intel, attend des adresses de 16 bits pour LJMP et LCALL au format big-endian ; cependant, les instructions xCALL stockent l’adresse de retour sur la pile au format little-endian.

SPARC utilisait historiquement le big-endian jusqu’à la version 9, qui est bi-endian ; de même, les premiers processeurs IBM POWER étaient big-endian, mais les descendants PowerPC et Power ISA sont maintenant bi-endian. L’architecture ARM était little-endian avant la version 3 où elle est devenue bi-endian.

Architectures actuellesEdit

Les séries de processeurs Intel x86 et AMD64 / x86-64 utilisent le format little-endian. D’autres architectures de jeu d’instructions qui suivent cette convention, autorisant uniquement le mode little-endian, incluent Nios II, Andes Technology NDS32, et Qualcomm Hexagon.

Certaines architectures de jeu d’instructions permettent d’exécuter des logiciels de l’une ou l’autre endiannessur une architecture bi-endian. Cela inclut ARM AArch64, C-Sky, Power ISA, et RISC-V.

Les architectures uniquement big-endian incluent l’architecture z/Architecture d’IBM, Freescale ColdFire (qui est basée sur la série 68000 de Motorola), Atmel AVR32, et OpenRISC. Les systèmes d’exploitation IBM AIX et Oracle Solaris sur Power ISA et SPARC bi-endian fonctionnent en mode big-endian ; certaines distributions de Linux sur Power sont passées en mode little-endian.

Bi-endiannessEdit

Certaines architectures (notamment ARM versions 3 et supérieures, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 et IA-64) disposent d’un paramètre qui permet de commuter l’endianné dans les extractions et les stockages de données, les extractions d’instructions, ou les deux. Cette fonction peut améliorer les performances ou simplifier la logique des dispositifs et logiciels de mise en réseau. Le mot bi-endian, lorsqu’il est dit de matériel, dénote la capacité de la machine à calculer ou à passer des données dans l’un ou l’autre format endian.

Plusieurs de ces architectures peuvent être commutées par logiciel pour passer par défaut à un format endian spécifique (généralement fait au démarrage de l’ordinateur) ; cependant, sur certains systèmes, l’endianness par défaut est sélectionné par le matériel sur la carte mère et ne peut être modifié par logiciel (par ex.par exemple l’Alpha, qui fonctionne uniquement en mode big-endian sur le Cray T3E).

Notez que le terme bi-endian se réfère principalement à la façon dont un processeur traite les accès aux données. Les accès aux instructions (fetches des mots d’instructions) sur un processeur donné peuvent encore assumer un endianness fixe, même si les accès aux données sont entièrement bi-endian, bien que ce ne soit pas toujours le cas, comme sur le CPU Itanium d’Intel basé sur IA-64, qui permet les deux.

Notez également que certains CPU nominalement bi-endian nécessitent une aide de la carte mère pour commuter complètement l’endianness. Par exemple, les processeurs PowerPC 32 bits orientés bureau en mode little-endian agissent comme little-endian du point de vue des programmes en cours d’exécution, mais ils nécessitent que la carte mère effectue un swap 64 bits sur l’ensemble des 8 voies d’octets pour s’assurer que la vision little-endian des choses s’appliquera aux périphériques d’entrée/sortie. En l’absence de ce matériel inhabituel de la carte mère, le logiciel du pilote de périphérique doit écrire à différentes adresses pour annuler la transformation incomplète et doit également effectuer un échange d’octets normal.

Certains processeurs, tels que de nombreux processeurs PowerPC destinés à une utilisation embarquée et presque tous les processeurs SPARC, permettent un choix d’endianness par page.

Les processeurs SPARC depuis la fin des années 1990 (processeurs conformes à la norme SPARC v9) permettent de choisir l’endianness des données avec chaque instruction individuelle qui charge depuis ou stocke en mémoire.

L’architecture ARM supporte deux modes big-endian, appelés BE-8 et BE-32. Les processeurs jusqu’à ARMv5 ne prennent en charge que le mode BE-32 ou mode invariant des mots. Ici, tout accès 32 bits naturellement aligné fonctionne comme en mode little-endian, mais l’accès à un octet ou à un mot de 16 bits est redirigé vers l’adresse correspondante et les accès non alignés ne sont pas autorisés. ARMv6 introduit le mode BE-8 ou byte-invariant, dans lequel l’accès à un seul octet fonctionne comme en mode little-endian, mais l’accès à un mot de 16, 32 ou (à partir de ARMv8) 64 bits entraîne un échange d’octets des données. Cela simplifie l’accès à la mémoire non alignée ainsi que l’accès mappé en mémoire aux registres autres que 32 bits.

De nombreux processeurs ont des instructions pour convertir un mot dans un registre à l’endianness opposé, c’est-à-dire qu’ils échangent l’ordre des octets dans un mot de 16, 32 ou 64 bits. Tous les bits individuels ne sont cependant pas inversés.

Les processeurs récents d’architecture Intel x86 et x86-64 ont une instruction MOVBE (Intel Core depuis la génération 4, après Atom), qui va chercher un mot au format big-endian en mémoire ou écrit un mot en mémoire au format big-endian. Ces processeurs sont autrement complètement little-endian. Ils disposaient également déjà d’une gamme d’instructions de permutation pour inverser l’ordre des octets du contenu des registres, par exemple lorsque des mots ont déjà été récupérés à partir d’emplacements mémoire où ils étaient dans le  » mauvais  » endianness.

Point flottantEdit

Bien que les omniprésents processeurs x86 d’aujourd’hui utilisent le stockage little-endian pour tous les types de données (entier, point flottant), il existe un certain nombre d’architectures matérielles où les nombres à virgule flottante sont représentés sous forme big-endian tandis que les entiers sont représentés sous forme little-endian. Certains processeurs ARM ont une représentation en virgule flottante moitié little-endian, moitié big-endian pour les nombres à double précision : les deux mots de 32 bits sont stockés en little-endian comme les registres d’entiers, mais le plus significatif en premier. Comme il y a eu de nombreux formats de nombres à virgule flottante sans représentation standard « réseau », la norme XDR utilise la représentation big-endian IEEE 754. Il peut donc sembler étrange que la norme IEEE 754, largement répandue, ne spécifie pas l’endive. En théorie, cela signifie que même les données en virgule flottante IEEE standard écrites par une machine peuvent ne pas être lisibles par une autre. Toutefois, sur les ordinateurs standard modernes (c’est-à-dire ceux qui mettent en œuvre la norme IEEE 754), on peut en pratique supposer sans risque que l’endiveté est la même pour les nombres à virgule flottante que pour les nombres entiers, ce qui rend la conversion simple, quel que soit le type de données. (Les petits systèmes embarqués utilisant des formats spéciaux en virgule flottante peuvent cependant être une autre affaire.)

Données de longueur variableEdit

La plupart des instructions considérées jusqu’à présent contiennent la taille (longueurs) de ses opérandes dans le code d’opération. Les longueurs d’opérande fréquemment disponibles sont 1, 2, 4, 8 ou 16 octets.Mais il existe aussi des architectures où la longueur d’un opérande peut être maintenue dans un champ séparé de l’instruction ou avec l’opérande lui-même, par exemple au moyen d’une marque de mot. Une telle approche permet des longueurs d’opérande jusqu’à 256 octets ou même la taille complète de la mémoire.Les types de données de tels opérandes sont des chaînes de caractères ou BCD.

Les machines étant capables de manipuler de telles données avec une instruction (par exemple comparer, ajouter) sont par exemple. IBM 1401, 1410, 1620, System/3×0, ESA/390, et z/Architecture, toutes de type big-endian.

OptimizationEdit

Le système little-endian a la propriété qu’une même valeur peut être lue en mémoire à différentes longueurs sans utiliser différentes adresses (même lorsque des restrictions d’alignement sont imposées). Par exemple, un emplacement mémoire de 32 bits avec le contenu 4A 00 00 00 peut être lu à la même adresse comme étant soit 8 bits (valeur = 4A), 16 bits (004A), 24 bits (00004A), ou 32 bits (0000004A), qui conservent tous la même valeur numérique. Bien que cette propriété little-endian soit rarement utilisée directement par les programmeurs de haut niveau, elle est souvent employée par les optimiseurs de code ainsi que par les programmeurs en langage d’assemblage.

En termes plus concrets, de telles optimisations sont l’équivalent du code C suivant retournant vrai sur la plupart des systèmes little-endian :

union { uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64;} u = { .u64 = 0x4A };puts(u.u8 == u.u16 && u.u8 == u.u32 && u.u8 == u.u64 ? "true" : "false");

Bien qu’il ne soit pas autorisé par le C++, un tel code de relance de type est autorisé comme « défini par l’implémentation » par la norme C11 et couramment utilisé dans le code interagissant avec le matériel.

D’autre part, dans certaines situations, il peut être utile d’obtenir une approximation d’une valeur de plusieurs octets ou de plusieurs mots en ne lisant que sa partie la plus significative au lieu de la représentation complète ; un processeur big-endian peut lire une telle approximation en utilisant la même adresse de base qui serait utilisée pour la valeur complète.

Les optimisations de ce type ne sont pas portables sur des systèmes d’endianness différents.

Ordre de calculEdit

Certaines opérations dans les systèmes de nombres positionnels ont un ordre naturel ou préféré dans lequel les étapes élémentaires doivent être exécutées.Cet ordre peut affecter leurs performances sur les processeurs adressables par octets et les microcontrôleurs de petite taille.

Cependant, les processeurs à haute performance récupèrent généralement les opérandes typiques de plusieurs octets de la mémoire dans le même temps qu’ils auraient récupéré un seul octet, de sorte que la complexité du matériel n’est pas affectée par l’ordre des octets.

Opérations commençant au chiffre le moins significatifEdit

L’addition, la soustraction et la multiplication commencent à la position du chiffre le moins significatif et propagent la retenue à la position plus significative suivante.L’adressage de données à plusieurs chiffres sur son premier octet (= adresse la plus petite) est le schéma d’adressage prédominant.Lorsque ce premier octet contient le chiffre le moins significatif – ce qui équivaut à un petit endien, alors la mise en œuvre de ces opérations est marginalement plus simple.

Opérations commençant au chiffre le plus significatifEdit

La comparaison et la division commencent au chiffre le plus significatif et propagent un éventuel report aux chiffres les moins significatifs suivants. Pour les valeurs numériques de longueur fixe (typiquement de longueur 1,2,4,8,16), l’implémentation de ces opérations est marginalement plus simple sur les machines big-endian.

Opérandes de longueur variableEdit

De nombreux processeurs big-endian contiennent des instructions matérielles pour comparer lexicographiquement des chaînes de caractères de longueur variable (par ex. le System/360 d’IBM et ses successeurs).

Opérations sans impactEdit

Le transport normal des données par une instruction d’affectation est en principe indépendant de l’endianness du processeur.

Moyen-endienEdit

De nombreux autres ordonnancements, appelés génériquement moyen-endien ou mixte-endien, sont possibles. Un tel exemple, en dehors de l’informatique, est le formatage standard américain de la date mois/jour/année.

PDP-endianEdit

Le PDP-11 est en principe un système 16 bits little-endian. Les instructions pour convertir entre les valeurs à virgule flottante et les valeurs entières dans le processeur à virgule flottante optionnel du PDP-11/45, PDP-11/70, et dans certains processeurs ultérieurs, stockaient des valeurs 32 bits « double precision integer long » avec les moitiés 16 bits permutées par rapport à l’ordre little-endian attendu. Le compilateur C d’UNIX utilisait le même format pour les entiers longs de 32 bits. Cet ordonnancement est connu sous le nom de PDP-endian.

Une façon d’interpréter cette endiannité est qu’il stocke un entier de 32 bits comme deux mots de 16 bits en big-endian, mais les mots eux-mêmes sont little-endian (E.par exemple, « jag cog sin » serait « gaj goc nis »):

Stockage d’un entier de 32 bits, 0x0A0B0C0D, sur un PDP-11
adresses croissantes →
…. 0Bh 0Ah 0Dh 0Ch
0A0Bh 0C0Dh

Les valeurs 16 bits font ici référence à leur valeur numérique, et non à leur disposition réelle.

Moneywell Series 16Edit

Les ordinateurs 16 bits de la série Honeywell, dont le Honeywell 316, sont à l’opposé du PDP-11 en ce qui concerne le stockage des mots 32 bits en C. Il stocke chaque mot de 16 bits dans l’ordre big-endian, mais les assemble de manière little-endian:

stockage d’un entier de 32 bits, 0x0A0B0C0D, sur un Honeywell 316
adresses croissantes →
0Ch 0Dh 0Ah 0Bh
…. 0C0Dh 0A0Bh

Descripteurs de segment Intel IA-32Edit

Les descripteurs de segment des processeurs IA-32 et compatibles conservent une adresse de base de 32 bits du segment stockée dans l’ordre little-endian, mais dans quatre octets non consécutifs, aux positions relatives 2, 3, 4 et 7 du début du descripteur.