Endianness (Polski)

Historiaedit

wiele historycznych i istniejących procesorów używa reprezentacji pamięci big-endian, wyłącznie lub jako opcji projektowej. Reprezentacja pamięci Big-endian jest powszechnie określana jako porządek sieciowy, używany w pakiecie protokołów internetowych. Inne typy procesorów używają reprezentacji pamięci little-endian; inne używają jeszcze innego schematu zwanego „middle-endian”, „mixed-endian” lub „PDP-11-endian”.

IBM System/360 używa big-endian byte order, podobnie jak jego następcy System/370, ESA/390 i z / Architecture., PDP-10 używa również adresacji big-endian dla instrukcji zorientowanych na bajty. Minikomputer z serii IBM / 1 wykorzystuje również porządek bajtów big-endian.

radzenie sobie z danymi o różnej endianess jest czasami określane jako problem NUXI. Terminologia ta nawiązuje do konfliktów w kolejności bajtów występujących podczas adaptacji Uniksa, który działał na mixed-endian PDP-11, do komputera big-endian IBM Series / 1. Unix był jednym z pierwszych systemów pozwalających na kompilację tego samego kodu dla platform o różnych reprezentacjach wewnętrznych., Jeden z pierwszych przekonwertowanych programów miał wydrukować Unix, ale na Series/1 zamiast tego wydrukował nUxi.

Datapoint 2200 wykorzystuje prostą logikę bitowo-szeregową z little-endian w celu ułatwienia propagacji przenoszenia. Kiedy Intel opracował mikroprocesor 8008 dla Datapoint, użyli little-endian dla kompatybilności., Jednak ponieważ Intel nie był w stanie dostarczyć 8008 na czas, Datapoint użył średniej skali integracji odpowiednik, ale mało endianess został zachowany w większości projektów Intela, w tym MCS-48 i 8086 i jego następców x86. DEC Alpha, Atmel AVR, VAX, rodzina MOS Technology 6502 (w tym Western Design Center 65802 i 65c816), Zilog Z80 (w tym z180 i eZ80), Altera Nios II i wiele innych procesorów i rodzin procesorów są również little-endian.

procesory Motorola 6800 / 6801, 6809 i 68000 wykorzystywały format big-endian.,

Intel 8051, w przeciwieństwie do innych procesorów Intela, oczekuje 16-bitowych adresów dla LJMP i LCALL w formacie big-endian; jednak instrukcje xCALL przechowują adres zwrotny na stosie w formacie little-endian.

SPARC historycznie używał big-endian aż do wersji 9, która jest bi-endian; podobnie wczesne procesory IBM POWER były big-endian, ale potomkowie PowerPC i Power ISA są teraz bi-endian. Architektura ARM była little-endian przed wersją 3, kiedy stała się bi-endian.,

obecne architekturyedytuj

seria procesorów Intel x86 i AMD64 / x86-64 używa formatu little-endian. Inne architektury zestawów instrukcji, które przestrzegają tej konwencji, zezwalając tylko na tryb little-endian, obejmują Nios II, Andes Technology NDS32 i Qualcomm Hexagon.

niektóre architektury zestawów instrukcji umożliwiają uruchamianie oprogramowania o dowolnej endianess na architekturze bi-endian. Obejmuje to ARM AArch64, C-Sky, Power ISA i RISC-V.,

do architektur big-endian należą: IBM Z / Architecture, Freescale ColdFire (oparty na serii Motorola 68000), Atmel AVR32 i OpenRISC. Systemy operacyjne IBM AIX i Oracle Solaris na bi-Endian Power ISA i SPARC działają w trybie big-endian; niektóre dystrybucje Linuksa na Power przeszły w tryb little-endian.,

Bi-endiannesedytuj

niektóre architektury (w tym ARM w wersji 3 i nowszej, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 i IA-64) posiadają ustawienie, które pozwala na przełączanie endianess w pobieraniu i przechowywaniu danych, pobieraniu instrukcji lub obu. Ta funkcja może poprawić wydajność lub uprościć logikę urządzeń sieciowych i oprogramowania. Słowo bi-endian, gdy mówi o sprzęcie, oznacza zdolność Maszyny do obliczania lub przekazywania danych w dowolnym formacie endian.,

wiele z tych architektur można przełączyć za pomocą oprogramowania na domyślny format endian (zwykle robi się to po uruchomieniu komputera); jednak w niektórych systemach domyślna endianess jest wybierana przez sprzęt na płycie głównej i nie może być zmieniana za pomocą oprogramowania(np. Alpha, która działa tylko w trybie big-endian na Cray T3E).

zauważ, że termin „bi-endian” odnosi się przede wszystkim do sposobu, w jaki procesor traktuje dostęp do danych., Dostęp do instrukcji (pobieranie słów instrukcji) na danym procesorze może nadal przyjmować stałą endianess, nawet jeśli dostęp do danych jest w pełni bi-endian, choć nie zawsze tak jest, jak na procesorze Intel IA-64 Itanium, który pozwala na oba.

zauważ też, że niektóre nominalnie bi-endian CPU wymagają pomocy płyty głównej, aby w pełni zmienić endianess., Na przykład, 32-bitowe procesory PowerPC w trybie little-endian działają jak little-endian z punktu widzenia wykonujących programy, ale wymagają od płyty głównej przeprowadzenia 64-bitowej wymiany we wszystkich pasach 8 bajtów, aby upewnić się, że Widok rzeczy little-endian będzie miał zastosowanie do urządzeń We/Wy. W przypadku braku tego nietypowego sprzętu płyty głównej, oprogramowanie sterownika urządzenia musi pisać na różne adresy, aby cofnąć niekompletną transformację, a także musi wykonać normalną zamianę bajtów.,

niektóre procesory, takie jak wiele procesorów PowerPC przeznaczonych do wbudowanego użytku i prawie wszystkie procesory SPARC, pozwalają na wybór endianess na stronie.

procesory SPARC od końca lat 90. (procesory zgodne z”SPARC v9″) umożliwiają wybieranie endianess danych z każdą indywidualną instrukcją, która ładuje się lub zapisuje do pamięci.

architektura ARM obsługuje dwa tryby big-endian, zwane BE-8 i BE-32. Procesory do ARMv5 obsługują tylko tryb be-32 lub Word-Invariant., Tutaj każdy naturalnie wyrównany dostęp 32-bitowy działa jak w trybie little-endian, ale dostęp do bajtu lub 16-bitowego słowa jest przekierowywany na odpowiedni adres i dostęp bez wyrównania nie jest dozwolony. ARMv6 wprowadza tryb be-8 lub Byte-Invariant, w którym dostęp do pojedynczego bajtu działa jak w trybie little-endian, ale dostęp do 16-bitowego, 32-bitowego lub (począwszy od ARMv8) 64-bitowego słowa powoduje zamianę bajtów danych. Upraszcza to niezaliczany dostęp do pamięci, a także dostęp mapowany do rejestrów innych niż 32-bitowy.,

wiele procesorów ma instrukcje konwersji słowa w rejestrze na przeciwną endianess, to znaczy, że zamieniają kolejność bajtów w słowie 16-, 32 – lub 64-bitowym. Wszystkie poszczególne bity nie są jednak odwrócone.

najnowsze procesory architektury Intel x86 i x86-64 mają instrukcję MOVBE (Intel Core od generacji 4, po Atom), która pobiera słowo w formacie big-endian z pamięci lub zapisuje słowo do pamięci w formacie big-endian. Procesory te są inaczej dokładnie mało endiańskie., Mieli też już szereg instrukcji swap, aby odwrócić kolejność bajtów zawartości rejestrów, np. gdy słowa zostały już pobrane z miejsc pamięci, w których znajdowały się w' złej ' Endzie.

Floating pointEdit

chociaż wszechobecne procesory x86 używają pamięci little-endian dla wszystkich typów danych (liczba całkowita, zmiennoprzecinkowa), istnieje wiele architektur sprzętowych, w których liczby zmiennoprzecinkowe są reprezentowane w formie big-endian, podczas gdy liczby całkowite są reprezentowane w formie little-endian., Istnieją procesory ARM, które mają Half little-endian, half big-endian reprezentację zmiennoprzecinkową dla liczb o podwójnej precyzji: oba 32-bitowe słowa są przechowywane w rejestrach całkowitych little-endian, ale najważniejszy jest pierwszy. Ponieważ istnieje wiele formatów zmiennoprzecinkowych, które nie mają dla nich” sieciowej ” reprezentacji standardowej, standard XDR wykorzystuje jako swoją reprezentację big-endian IEEE 754. Może więc wydawać się dziwne, że powszechny standard zmiennoprzecinkowy IEEE 754 nie określa endianness., Teoretycznie oznacza to, że nawet standardowe dane zmiennoprzecinkowe IEEE zapisane przez jedną maszynę mogą nie być odczytane przez inną. IEEE 754), można w praktyce bezpiecznie założyć, że endianness jest taki sam dla liczb zmiennoprzecinkowych jak dla liczb całkowitych, dzięki czemu konwersja jest prosta niezależnie od typu danych. (Małe systemy wbudowane wykorzystujące specjalne formaty zmiennoprzecinkowe mogą być jednak inną sprawą.,)

zmienna długość dataEdit

Większość instrukcji rozważanych do tej pory zawiera Rozmiar (Długości) jej operandów w kodzie operacji. Często Dostępne długości operandów to 1, 2, 4, 8 lub 16 bajtów.Istnieją jednak również architektury, w których długość operandu może być utrzymywana w oddzielnym polu instrukcji lub z samym operandem, np. za pomocą znaku słownego. Takie podejście pozwala na długości operandów do 256 bajtów lub nawet Pełny rozmiar pamięci.Typy danych takich operandów to ciągi znaków lub BCD.,

OptimizationEdit

System little-endian ma właściwość, że ta sama wartość może być odczytywana z pamięci na różnych długościach bez używania różnych adresów (nawet jeśli zostaną nałożone ograniczenia wyrównania). Na przykład 32-bitowa lokalizacja pamięci z zawartością 4A 00 00 00 może być odczytana pod tym samym adresem, co 8-bitowa (wartość = 4A), 16-bitowa (004A), 24-bitowa (00004a) lub 32-bitowa (0000004a), z których wszystkie zachowują tę samą wartość liczbową., Chociaż ta właściwość little-endian rzadko jest używana bezpośrednio przez programistów wysokiego poziomu, jest często używana przez optymalizatorów kodu, a także przez programistów języka asemblacji.

w bardziej konkretny sposób, takie optymalizacje są odpowiednikiem następującego kodu C zwracającego wartość true w większości systemów 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");

chociaż nie jest dozwolony przez C++, taki kod jest dozwolony jako „implementation-defined” przez standard C11 i powszechnie używany w kodzie interakcji ze sprzętem.,

z drugiej strony, w niektórych sytuacjach przydatne może być uzyskanie przybliżenia wartości wielobajtowej lub wielowyrazowej przez odczytanie tylko jej najbardziej znaczącej części zamiast pełnej reprezentacji; procesor big-endian może odczytać takie przybliżenie przy użyciu tego samego adresu bazowego, który byłby używany dla pełnej wartości.

tego typu optymalizacje nie są przenośne w systemach o różnej endianess.

kolejność Obliczeniowaedit

niektóre operacje w pozycyjnych systemach liczbowych mają naturalną lub preferowaną kolejność, w której mają być wykonywane kroki elementarne.,Kolejność ta może wpływać na ich wydajność na małych procesorach i mikrokontrolerach adresowalnych bajtowo.

jednak wysokowydajne procesory zwykle pobierają z pamięci typowe wielobajtowe operandy w tym samym czasie, w którym pobierałyby pojedynczy bajt, więc kolejność bajtów nie ma wpływu na złożoność sprzętu.

operacje rozpoczynające się od najmniej znaczącej cyfryedytuj

jak uczy się w szkole, dodawanie, odejmowanie i mnożenie rozpoczynają się od najmniej znaczącej cyfry i propagują przenoszenie do kolejnej, bardziej znaczącej pozycji.,Adresowanie danych wielocyfrowych w pierwszym (=najmniejszym) bajcie jest dominującym schematem adresowania.Jeśli ten pierwszy bajt zawiera najmniej znaczącą cyfrę-co jest równoznaczne z małą endianess, wówczas implementacja tych operacji jest nieznacznie prostsza.

operacje rozpoczynające się od najbardziej znaczącej cyfryedytuj

porównanie i podział rozpoczynają się od najbardziej znaczącej cyfry i propagują możliwe przeniesienie do kolejnych mniej znaczących cyfr., Dla wartości liczbowych o stałej długości (zwykle o długości 1,2,4,8,16) realizacja tych operacji jest nieznacznie prostsza na maszynach big-endian.

operandy o różnej długościedytuj

w języku programowania C porównywanie leksykograficzne łańcuchów znaków musi być wykonywane przez podprogramy, które są często oferowane i implementowane jako podprogramy (np. strcmp).

wiele procesorów big-endian zawiera instrukcje sprzętowe do leksykograficznego porównywania łańcuchów znaków o różnej długości (np. IBM System / 360 i jego następcy).,

operacje bez wpływuedytuj

normalny transport danych za pomocą instrukcji assignment jest w zasadzie niezależny od endianess procesora.

Middle-endianEdit

możliwe są liczne inne ordery, ogólnie nazywane middle-endian lub mixed-endian. Jednym z takich przykładów poza nauką informatyczną jest standardowe Amerykańskie formatowanie daty miesiąca / dnia/roku.

PDP-endianEdit

PDP-11 jest w zasadzie 16-bitowym systemem little-endian., Instrukcje do konwersji pomiędzy wartościami zmiennoprzecinkowymi i całkowitymi w opcjonalnym procesorze zmiennoprzecinkowym PDP-11/45, PDP-11/70 oraz w niektórych późniejszych procesorach zapisywały 32-bitowe wartości „double precision integer long” z 16-bitowymi połówkami zamienionymi na oczekiwaną kolejność little-endian. Kompilator UNIX C używał tego samego formatu dla 32-bitowych liczb całkowitych. Kolejność ta jest znana jako PDP-endian.

sposobem na interpretację tej endianess jest to, że przechowuje 32-bitową liczbę całkowitą jako dwa 16-bitowe słowa w big-endian, ale same słowa są little-endian (np., „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 …,

16-bitowe wartości odnoszą się do ich wartości liczbowych, a nie do ich rzeczywistego układu.

Honeywell Series 16Edit

16-bitowe komputery Honeywell Series 16, w tym Honeywell 316, są przeciwieństwem PDP-11 w przechowywaniu 32-bitowych słów w języku 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *