Endianness (Português)

HistoryEdit

muitos processadores históricos e existentes usam uma representação de memória Big-endiana, exclusivamente ou como uma opção de design. A representação de memória big-endian é comumente referida como ordem de rede, como usado na suíte de Protocolo da Internet. Outros tipos de processadores usam representação de memória little-endian; outros ainda usam outro esquema chamado “middle-endian”, “mixed-endian”ou” PDP-11-endian”.

O sistema IBM / 360 usa a ordem byte big-endian, assim como seus sucessores System/370, ESA/390 e z/Architecture., O PDP-10 também usa endereçamento Big-endiano para instruções orientadas por byte. O minicomputador IBM Series/1 também usa a ordem byte big-endian.lidar com dados de diferentes endianness é às vezes chamado de problema NUXI. Esta terminologia alude aos conflitos de ordem byte encontrados ao adaptar o UNIX, que funcionava no PDP-11 mixed-endian, a um computador IBM Series/1 big-endian. Unix foi um dos primeiros sistemas a permitir que o mesmo código fosse compilado para plataformas com diferentes representações internas., Um dos primeiros programas convertidos deveria imprimir Unix , mas na Série/1 imprimiu nUxi instead.

O Datapoint 2200 usa lógica simples de bit-serial COM little-endian para facilitar a propagação de carry. Quando a Intel desenvolveu o microprocessador 8008 para Datapoint, eles usaram little-endian para compatibilidade., No entanto, como a Intel foi incapaz de entregar o 8008 no tempo, a Datapoint usou um equivalente de integração de média escala, mas o pouco endianness foi mantido na maioria dos projetos da Intel, incluindo o MCS-48 e o 8086 e seus sucessores x86. O DEC Alpha, Atmel AVR, VAX, a família MOS Technology 6502 (incluindo Western Design Center 65802 e 65C816), o Zilog Z80 (incluindo Z180 e eZ80), a Altera Nios II, e muitas outras famílias de processadores e processadores também são little-endian.

A Motorola 6800 / 6801, a série 6809 e a série 68000 de processadores usaram o formato big-endian.,

A Intel 8051, ao contrário de outros processadores da Intel, espera endereços de 16 bits para LJMP e LCALL no formato big-endian; no entanto, xCALL instruções de armazenar o endereço de retorno na pilha no formato little-endian.

SPARC historicamente usou big-endian até a versão 9, que é bi-endian; similarmente os primeiros processadores de potência IBM eram big-endian, mas os descendentes PowerPC e Power ISA são agora bi-endian. A arquitetura ARM era little-endian antes da versão 3, quando se tornou bi-endian.,

architectureresedit

a série Intel x86 e AMD64 / x86-64 de processadores usam o formato little-endian. Outras arquiteturas de conjuntos de instruções que seguem esta convenção, permitindo apenas o modo little-endian, incluem Nios II, Andes Technology NDS32, e Qualcomm Hexagon.

algumas arquiteturas de conjuntos de instruções permitem a execução de software de qualquer tipo de endianidade em uma arquitetura bi-endiana. Isto inclui ARM AArch64, C-Sky, Power ISA, e RISC-V.,

somente as arquiteturas big-endian incluem a IBM z / Architecture, Freescale ColdFire( que é baseado na série Motorola 68000), Atmel AVR32, e OpenRISC. Os sistemas operacionais IBM AIX e Oracle Solaris no modo bi-endian Power ISA e SPARC funcionam no modo big-endian; algumas distribuições do Linux no modo Power moveram-se para o modo little-endian.,

Bi-endiannessEdit

Algumas arquiteturas (incluindo o BRAÇO versões 3 e acima, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 e IA-64) apresentam uma definição que permite comutável ordenação de dados obtém e armazena, de instrução de busca, ou ambos. Este recurso pode melhorar o desempenho ou simplificar a lógica de dispositivos de rede e software. A palavra bi-endian, quando dito de hardware, denota a capacidade da máquina para computar ou passar dados em qualquer formato endian.,

Muitas dessas arquiteturas pode ser comutado através de um software padrão para um determinado endian (geralmente feito quando o computador é iniciado); no entanto, em alguns sistemas, o padrão de ordenação é selecionado pelo hardware na placa-mãe e não pode ser alterada através de um software (por exemplo, Alpha, que é executado somente no big-endian modo o Cray T3E).

Note que o termo “bi-endian” refere-se principalmente à forma como um processador trata acessos de dados., Accesses de instrução (fetches of instruction words) em um dado processador ainda pode assumir uma endianidade fixa, mesmo se os acessos de dados são totalmente bi-endian, embora este não seja sempre o caso, como no Intel IA-64-based Itanium CPU, que permite ambos.

Note, too, that some nominally bi-endian CPUs require motherboard help to fully switch endianness., Por exemplo, os processadores PowerPC orientados para o desktop de 32 bits no modo little-endian atuam como little-endian do ponto de vista dos programas de execução, mas eles exigem que a placa-mãe realize uma troca de 64 bits em todas as 8 faixas de byte para garantir que a visão pouco-endiana das coisas se aplicará aos dispositivos I/O. Na ausência deste incomum hardware da placa-mãe, o software driver do dispositivo deve escrever para diferentes endereços para desfazer a transformação incompleta e também deve realizar uma troca de bytes normal.,

alguns CPUs, como muitos processadores PowerPC destinados a uso embutido e quase todos os processadores SPARC, permitem a escolha por página de endianness.

processadores SPARC desde o final da década de 1990 (processadores compatíveis com SPARC v9) permitem que a endianness dos dados seja escolhida com cada instrução individual que carrega ou armazena para a memória.

A arquitetura ARM suporta dois modos big-endian, chamados BE-8 e BE-32. CPUs até ARMv5 só suportam o modo BE-32 ou invariante de palavras., Aqui qualquer acesso de 32 bits naturalmente alinhado funciona como no modo little-endian, mas o acesso a um byte ou palavra de 16 bits é redirecionado para o endereço correspondente e o acesso não alinhado não é permitido. ARMv6 introduz o modo BE-8 ou Byte-invariante, onde o acesso a um único byte funciona como no modo little-endian, mas acessando um 16-bit, 32-bit ou (começando com ARMv8) 64-bit resulta em uma troca de byte dos dados. Isso simplifica o acesso de memória não alinhada, bem como o acesso mapeado de memória a outros registros que não 32 bits.,

muitos processadores têm instruções para converter uma palavra em um registro para a endianness oposta, ou seja, eles trocam a ordem dos bytes em uma palavra de 16, 32 ou 64 bits. No entanto, todos os bits individuais não são invertidos.

Intel X86 e CPUs de arquitetura x86-64 recentes têm uma instrução MOVBE (Intel Core desde a geração 4, Após Atom), que obtém uma palavra de formato big-endian da memória ou escreve uma palavra na memória em formato big-endian. Estes processadores são completamente pequenos-endian., Eles também já tinham uma série de instruções de troca para reverter a ordem de bytes do conteúdo dos registros, como quando as palavras já foram obtidas a partir de locais de memória onde eles estavam na endianidade ‘errada’.

Flutuante pointEdit

Embora o onipresente processadores x86 de hoje little-endian armazenamento para todos os tipos de dados (inteiro, ponto flutuante), há um número de arquiteturas de hardware, onde os números de ponto flutuante são representados no big-endian forma, enquanto os números inteiros são representados em little-endian formulário., Existem processadores ARM que têm metade pequena-endian, metade grande-endian de representação de ponto flutuante para números de precisão dupla: ambas as palavras de 32-bit são armazenadas em pequenos-endian como registros inteiros, mas o mais significativo primeiro. Como tem havido muitos formatos de ponto flutuante sem representação padrão de” rede ” para eles, o padrão XDR usa o big-endian IEEE 754 como sua representação. Pode, portanto, parecer estranho que a norma generalizada IEEE 754 de vírgula flutuante não especifique a perigosidade., Teoricamente, isso significa que mesmo os dados padrão de ponto flutuante IEEE escritos por uma máquina podem não ser legíveis por outra. No entanto, em computadores modernos padrão (isto é, implementando IEEE 754), pode-se na prática assumir com segurança que a endianness é o mesmo para números de ponto flutuante como para inteiros, tornando a conversão simples independentemente do tipo de dados. (Pequenos sistemas embutidos que utilizam formatos especiais de vírgula flutuante podem, no entanto, ser outra questão.,)

Variable length dataEdit

a maioria das instruções consideradas até agora contêm o tamanho (comprimentos) dos seus operandos dentro do código de operação. Os comprimentos de operando frequentemente disponíveis são 1, 2, 4, 8 ou 16 bytes.Mas também existem arquiteturas onde o comprimento de um operando pode ser realizado em um campo separado da instrução ou com o próprio operando, por exemplo, por meio de uma marca de palavra. Tal abordagem permite comprimentos de operando até 256 bytes ou até mesmo tamanho de memória completa.Os tipos de dados desses operandos são cadeias de caracteres ou BCD.,

OptimizationEdit

o sistema little-endian tem a propriedade de que o mesmo valor pode ser lido a partir da memória a comprimentos diferentes sem usar endereços diferentes (mesmo quando restrições de alinhamento são impostas). Por exemplo, uma localização de memória de 32 bits com conteúdo 4A 00 00 00ódigo> pode ser lida no mesmo endereço que 8-bit (valor = 4A), 16-bit (004A), 24-bit (00004A), ou 32-bit (0000004A), todos os quais retêm o mesmo valor numérico., Embora esta propriedade little-endian raramente é usada diretamente por programadores de alto nível, é muitas vezes empregada por Otimizadores de código, bem como por programadores de linguagem de montagem.

Em termos mais concretos, tais otimizações são o equivalente da seguinte código C retornando true em mais de little-endian sistemas:

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");

Enquanto não permitido pelo C++, tal tipo de punning código é permitida como “definido para implementação” pelo C11 e padrão comumente utilizado no código de interagir com o hardware.,

por outro lado, em algumas situações pode ser útil para obter uma aproximação de um multi-byte ou multi-valor da palavra, lendo apenas a sua parte mais significativa, em vez de uma representação completa; um big-endian processador pode ler tal aproximação, utilizando o mesmo endereço, que seria usada para o valor total.

otimizações deste tipo não são portáveis através de sistemas de diferentes endianness.

cálculo orderEdit

algumas operações em sistemas de números posicionais têm uma ordem natural ou preferida em que os passos elementares devem ser executados.,Esta encomenda pode afectar o seu desempenho em processadores e microcontroladores em pequena escala endereçáveis por bytes.

no entanto, processadores de alto desempenho normalmente obtêm operandos multi-bytes típicos da memória na mesma quantidade de tempo que teriam obtido um único byte, de modo que a complexidade do hardware não é afetada pela ordem de bytes.

operações iniciando pelo menos significativo digitEdit

como aprendidas na escola, adição, subtração e multiplicação começam na posição de dígito menos significativa e propagam o transporte para a posição mais significativa subsequente.,Endereçando dados de vários dígitos em seu primeiro (=menor endereço) byte é o esquema de endereçamento predominante.Quando este primeiro byte contém o dígito menos significativo-o que é equivalente a pouco-endianness, então a implementação destas operações é marginalmente mais simples.

as operações com início no dígito mais significativo

comparação e divisão começam no dígito mais significativo e propagam um possível Transporte para os dígitos menos significativos subsequentes., Para valores numéricos de comprimento fixo (tipicamente de comprimento 1.2.48,16), a implementação destas operações é marginalmente mais simples em máquinas big-endian.

Operandos de diferentes lengthEdit

Na linguagem de programação C a obras lexicográficas de comparação de cadeias de caracteres tem de ser feito pela sub-rotinas, que é oferecida com freqüência e implementado como uma sub-rotina (e. g. strcmp).

muitos processadores big-endian contêm instruções de hardware para a comparação lexicográfica de diferentes cadeias de caracteres de comprimento (p. ex., o sistema IBM/360 e seus sucessores).,

Operations without impactEdit

The normal data transport by an assignment statement is in principle independent of the endianness of the processor.

endianEdit médio

inúmeras outras ordenações, genericamente chamadas de endiano médio ou endiano misto, são possíveis. Um exemplo fora da ciência da computação é a formatação de data padrão americana de Mês/Dia/Ano.

PDP-endianEdit

the PDP-11 is in principle a 16-bit little-endian system., As instruções converter-se entre o ponto-flutuante e inteiro de valores na opção de processador de ponto flutuante do PDP-11/45, PDP-11/70, e em alguns processadores posteriores, armazenados 32-bit de precisão dupla de número inteiro longo” valores de 16 bits metades trocadas do esperado ordem de little-endian. O compilador C UNIX usou o mesmo formato para inteiros de 32 bits. Esta ordem é conhecida como PDP-endian.

uma maneira de interpretar esta endianidade é que ela armazena um número inteiro de 32-bit como duas palavras de 16-bit em big-endian, mas as próprias palavras são pouco-endian(E. G., “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 …,

os valores de 16 bits aqui referem-se aos seus valores numéricos, não à sua disposição real.

Honeywell Series 16Edit

The Honeywell Series 16-bit computers, including the Honeywell 316, are the opposite of the PDP-11 in storing 32-bit words in 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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *