Endianness (Français)

HistoryEdit

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

L’IBM System/360 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 byte. Le mini-ordinateur IBM Series/1 utilise également l’ordre des octets big-endian.

traiter des données d’endianité différente 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 fonctionnait sur le PDP-11 à endian mixte, à un ordinateur IBM Series/1 à gros endian. Unix a été l’un des premiers systèmes à permettre la compilation du même code pour des plates-formes avec des représentations internes différentes., L’un des premiers programmes convertis était censé imprimer Unix, mais sur la Série/1 imprimé: nUxi à la place.

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

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

L’Intel 8051, contrairement aux autres processeurs Intel, attend des adresses 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 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 quand elle est devenue bi-endian.,

architectures Actuellesmodifier

Les processeurs Intel x86 et AMD64 / x86-64 utilisent le format little-endian. D’autres architectures de jeu d’instructions qui suivent cette convention, ne permettant que 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’un ou l’autre endianness sur une architecture bi-endian. Cela inclut ARM AArch64, C-Sky, Power ISA et RISC-V.,

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

Bi-endiannessEdit

certaines architectures (y compris les versions ARM 3 et supérieures, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 et IA-64) disposent d’un paramètre qui permet l’endianness commutable dans les extractions de données et les magasins, les extractions d’instructions, ou les deux. Cette fonctionnalité peut améliorer les performances ou simplifier la logique des périphériques réseau et des logiciels. Le mot bi-endian, lorsqu’il est dit de matériel, désigne la capacité de la machine à calculer ou à transmettre des données dans l’un ou l’autre format endian.,

beaucoup de ces architectures peuvent être commutées via un logiciel pour passer par défaut à un format endian spécifique (généralement effectué lorsque l’ordinateur démarre); 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 pas être modifié via un logiciel (par exemple, L’Alpha, qui ne fonctionne qu’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 (récupérations de mots d’instructions) sur un processeur donné peuvent toujours supposer une 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 processeur Itanium basé sur IA-64 D’Intel, qui permet les deux.

Notez également que certains processeurs nominalement bi-endian nécessitent une aide de la carte mère pour basculer complètement l’endianness., Par exemple, les processeurs PowerPC de bureau 32 bits 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 échange 64 bits sur les 8 voies d’octets pour s’assurer que la vue little-endian des choses s’appliquera aux périphériques d’E/S. En l’absence de ce matériel de carte mère inhabituel, 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 compatibles »SPARC v9″) permettent de choisir l’endianité des données avec chaque instruction individuelle qui se charge ou stocke en mémoire.

L’architecture ARM prend en charge 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 Word-Invariant., Ici, tout accès 32 bits naturellement aligné fonctionne comme en mode little-endian, mais l’accès à un octet ou à un mot 16 bits est redirigé vers l’adresse correspondante et l’accès non aligné n’est pas autorisé. ARMv6 introduit le mode BE – 8 ou Byte-Invariant, où l’accès à un seul octet fonctionne comme en mode little-endian, mais l’accès à un mot 16 bits, 32 bits ou (à partir D’ARMv8) 64 bits entraîne un échange d’octets des données. Cela simplifie l’accès mémoire non aligné ainsi que l’accès mémoire mappé à des registres autres que 32 bits.,

de nombreux processeurs ont des instructions pour convertir un mot dans un registre en 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 pas inversés cependant.

Les processeurs D’architecture Intel X86 et x86-64 récents ont une instruction MOVBE (Intel Core depuis la génération 4, après Atom), qui récupère un mot au format big-endian de la mémoire ou écrit un mot dans la mémoire au format big-endian. Ces processeurs sont par ailleurs complètement little-endian., Ils avaient également déjà une gamme d’instructions d’échange 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 de mémoire où ils se trouvaient dans la « mauvaise » endianness.

Floating pointEdit

bien que les processeurs x86 omniprésents d’aujourd’hui utilisent le stockage little-endian pour tous les types de données (entier, virgule flottante), 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., Il existe des processeurs ARM qui ont une représentation en virgule flottante moitié little-endian, moitié big-endian pour les nombres à double précision: les deux mots 32 bits sont stockés dans des registres entiers comme little-endian, mais le plus significatif en premier. Comme il existe de nombreux formats à virgule flottante sans représentation standard « réseau » pour eux, la norme XDR utilise le big-endian IEEE 754 comme représentation. Il peut donc sembler étrange que la norme à virgule flottante IEEE 754 répandue ne spécifie pas l’endianness., Théoriquement, cela signifie que même les données à virgule flottante IEEE standard écrites par une machine peuvent ne pas être lisibles par une autre. Cependant, sur les ordinateurs standard modernes (c’est-à-dire, implémentant IEEE 754), on peut en pratique supposer en toute sécurité que l’endianness est le même pour les nombres à virgule flottante que pour les entiers, ce qui rend la conversion simple quel que soit le type de données. (Les petits systèmes embarqués utilisant des formats à virgule flottante spéciaux peuvent être une autre affaire cependant.,)

variable length dataEdit

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érandes fréquemment disponibles sont de 1, 2, 4, 8 ou 16 octets.Mais il existe également 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 verbale. Une telle approche permet des longueurs d’opérande jusqu’à 256 octets ou même une taille de mémoire complète.Les types de données de ces opérandes sont des chaînes de caractères ou BCD.,

OptimizationEdit

Le système little-endian a la propriété que la même valeur peut être lue de la mémoire à différentes longueurs sans utiliser d’adresses différentes (même lorsque des restrictions d’alignement sont imposées). Par exemple, un emplacement de mémoire 32 bits avec un contenu 4A 00 00 00 peut être lu à la même adresse que 8 bits (value = 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 utilisée par les optimiseurs de code ainsi que par les programmeurs en langage assembleur.

en termes plus concrets, de telles optimisations sont l’équivalent du code C suivant renvoyant true 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 C++, Un tel code de punning de type est autorisé comme « implementation-defined » par la norme C11 et,

d’autre part, dans certaines situations, il peut être utile d’obtenir une approximation d’une valeur multi-octets ou multi-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’endianité différente.

calcul orderEdit

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 et microcontrôleurs adressables par octets à petite échelle.

cependant, les processeurs hautes performances récupèrent généralement des opérandes multi-octets typiques de la mémoire dans le même laps de 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 significatifmodifier

comme appris à l’école, l’addition, la soustraction et la multiplication commencent à la position du chiffre le moins significatif et propagent le report à la position la plus significative suivante.,L’adressage de données à plusieurs chiffres à son premier octet (=plus petite adresse) est le schéma d’adressage prédominant.Lorsque ce premier octet contient le chiffre le moins significatif – ce qui équivaut à peu-endianness, alors la mise en œuvre de ces opérations est légèrement plus simple.

opérations commençant au chiffre le plus significatifmodifier

la comparaison et la division commencent au chiffre le plus significatif et propagent un report possible aux chiffres moins significatifs suivants., Pour les valeurs numériques de longueur fixe (typiquement de longueur 1,2,4,8,16), la mise en œuvre de ces opérations est légèrement plus simple sur les machines big-endian.

opérandes de longueur variéedit

dans le langage de programmation C, la comparaison lexicographique des chaînes de caractères doit être effectuée par des sous-programmes, qui sont fréquemment proposés et implémentés en tant que sous-Programmes (par exemple strcmp).

de nombreux processeurs big-endian contiennent des instructions matérielles pour comparer lexicographiquement des chaînes de caractères de longueur variable (par exemple le système IBM / 360 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’endianité du processeur.

Moyen-endianEdit

de Nombreux autres ordres, appelés génériquement moyen-endian ou mixte-endian, sont possibles. Un tel exemple en dehors de l’informatique est le formatage américain standard de la date du Mois/Jour/Année.

PDP-endianEdit

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

Une façon d’interpréter cette endianness 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 (par exemple, « jag cog sin » would be « gaj goc nis »):

Storage of a 32-bit integer, 0x0A0B0C0D, on a PDP-11
increasing addresses →
0Bh 0Ah 0Dh 0Ch
0A0Bh 0C0Dh …,

Les valeurs 16 bits ici se réfèrent à leurs valeurs numériques, pas à leur disposition réelle.

Honeywell Series 16Edit

Les ordinateurs Honeywell Series 16 16 bits, y compris le Honeywell 316, sont à L’opposé du PDP-11 en stockant des mots 32 bits en C., It stores each 16-bit word in big-endian order, but joins them together in little-endian manner:

storage of a 32-bit integer, 0x0A0B0C0D, on a Honeywell 316
increasing addresses →
0Ch 0Dh 0Ah 0Bh
…, 0C0Dh 0A0Bh

Intel IA-32 segment descriptorsEdit

Segment descriptors of IA-32 and compatible processors keep a 32-bit base address of the segment stored in little-endian order, but in four nonconsecutive bytes, at relative positions 2, 3, 4 and 7 of the descriptor start.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *