Endianness
- HistoryEdit
- Arquiteturas atuaisEdit
- Bi-endiannessEdit
- Ponto flutuanteEditar
- Dados de comprimento variávelEditar
- OptimizationEdit
- Ordem de cálculoEditar
- Operações iniciando pelo menos um dígito significativoEditar
- Operações que começam no dígito mais significativoEditar
- Operandos de comprimento variávelEditar
- Operações sem impactoEdit
- Middle-endianEdit
- PDP-endianEdit
- Série Honeywell 16Edit
- Intel IA-32 descritores de segmentoEditar
HistoryEdit
Muitos processadores históricos e existentes usam uma representação de memória big-endiana, seja exclusivamente ou como uma opção de design. A representação da memória big-endiana é comumente chamada de ordem de rede, como usada no conjunto de protocolos da Internet. Outros tipos de processadores usam representação de memória little-endian; outros usam ainda outro esquema chamado “middle-endian”, “mixed-endian” ou “PDP-11-endian”.
O IBM System/360 usa ordem de bytes big-endian, assim como seus sucessores System/370, ESA/390, e z/Architecture. O PDP-10 também utiliza o endereçamento big-endian para instruções orientadas a bytes. O minicomputador IBM Series/1 também usa ordem de byte big-endian.
Tratar com dados de diferentes endianness é às vezes chamado de problema NUXI. Esta terminologia alude aos conflitos de ordem de bytes encontrados durante a adaptação do UNIX, que rodava no PDP-11 mix-endian, a um computador big-endian IBM Series/1. O Unix foi um dos primeiros sistemas a permitir a compilação do mesmo código para plataformas com diferentes representações internas. Um dos primeiros programas convertidos deveria imprimir Unix
, mas na Série/1 ele imprimiu nUxi
em vez disso.
O Datapoint 2200 usa lógica bit-serial simples com little-endian para facilitar a propagação de carry. Quando a Intel desenvolveu o microprocessador 8008 para Datapoint, eles usaram o little-endian para compatibilidade. Entretanto, como a Intel não conseguiu entregar o 8008 a tempo, o Datapoint usou um equivalente de integração em média escala, mas a little-endianness foi mantida 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 o Western Design Center 65802 e 65C816), o Zilog Z80 (incluindo Z180 e eZ80), o Altera Nios II, e muitos outros processadores e famílias de processadores também são little-endian.
O Motorola 6800 / 6801, o 6809 e a série 68000 de processadores usaram o formato big-endian.
O Intel 8051, ao contrário de outros processadores Intel, espera endereços 16-bit para LJMP e LCALL no formato big-endian; no entanto, as instruções xCALL armazenam o endereço de retorno na pilha no formato little-endian.
SPARC historicamente usavam big-endian até a versão 9, que é bi-endian; da mesma forma, os primeiros processadores IBM POWER 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.
Arquiteturas atuaisEdit
Os processadores Intel x86 e AMD64 / x86-64 series usam o formato little-endian. Outras arquiteturas de conjunto 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 conjunto de instruções permitem a execução de software de endianness em uma arquitetura bi-endian. Isso inclui o ARM AArch64, C-Sky, Power ISA e RISC-V.
Arquiteturasolely big-endian incluem a IBM z/Architecture, Freescale ColdFire (que é baseada na série 68000 da Motorola), Atmel AVR32 e OpenRISC. Os sistemas operacionais IBM AIX e Oracle Solaris em bi-endian Power ISA e SPARC rodam em modo big-endian; algumas distribuições do Linux em Power passaram para o modo little-endian.
Bi-endiannessEdit
Algumas arquiteturas (incluindo ARM versões 3 e superiores, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 e IA-64) possuem uma configuração que permite a possibilidade de troca de endianness em busca e armazenamento de dados, busca de instruções, ou ambos. Este recurso pode melhorar o desempenho ou simplificar a lógica de dispositivos e software de rede. A palavra bi-endian, quando dita de hardware, denota a capacidade da máquina de computar ou passar dados no formato endian.
Muitas destas arquiteturas podem ser comutadas via software para o formato endian padrão para um formato endian específico (normalmente feito quando o computador inicia); no entanto, em alguns sistemas o endianness padrão é selecionado por hardware na placa-mãe e não pode ser alterado via software (e.por exemplo, o Alfa, que roda apenas em modo big-endian no Cray T3E).
Nota que o termo bi-endian se refere primariamente a como um processador trata os acessos aos dados. Os acessos de instrução (fetches de palavras de instrução) em um determinado processador ainda podem assumir uma endianness fixa, mesmo que os acessos aos dados sejam totalmente bi-endianos, embora isso nem sempre seja o caso, como na CPU Itanium baseada em IA-64 da Intel, que permite ambos.
Note, também, que algumas CPUs nominalmente bi-endianas requerem ajuda da placa-mãe para mudar completamente a endianness. Por exemplo, os processadores PowerPC de 32 bits orientados para desktop no modo little-endian agem como little-endian do ponto de vista dos programas em execução, mas requerem que a placa-mãe execute uma troca de 64 bits em todas as pistas de 8 bytes para garantir que a visão little-endian das coisas se aplique aos dispositivos de E/S. Na ausência deste hardware incomum da placa-mãe, o software do driver do dispositivo deve escrever em endereços diferentes para desfazer a transformação incompleta e também deve executar uma troca de bytes normal.
algumas CPUs, como muitos processadores PowerPC destinados a uso embarcado e quase todos os processadores SPARC, permitem a escolha de endianness por página.
Processadores SPARC desde o final dos anos 90 (processadores compatíveis com SPARC v9) permitem que a endianness de dados seja escolhida com cada instrução individual que carrega ou armazena na memória.
A arquitectura ARM suporta dois modos big-endian, chamados BE-8 e BE-32. CPUs até o ARMv5 suportam apenas o modo BE-32 ou o modo verbal-invariante. 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 o acesso a uma palavra de 16 bits, 32 bits ou (começando com ARMv8) 64 bits resulta em uma troca de bytes dos dados. Isto simplifica o acesso não alinhado à memória, bem como o acesso mapeado à memória a registros que não sejam 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. Todos os bits individuais não são invertidos, embora.
Os CPUs das arquiteturas x86 e x86-64 recentes Intel têm uma instrução MOVBE (Intel Core desde a geração 4, depois do Atom), que pega uma palavra no formato big-endian da memória ou escreve uma palavra na memória no formato big-endian. Estes processadores são, de resto, completamente pequenos-endianos. Eles também já tinham uma gama de instruções swap para inverter a ordem de bytes do conteúdo dos registros, como quando as palavras já foram buscadas em locais da memória onde elas estavam na endianness “errada”.
Ponto flutuanteEditar
Embora os omnipresentes processadores x86 de hoje usem armazenamento little-endian para todos os tipos de dados (inteiro, ponto flutuante), há uma série de arquiteturas de hardware onde números de ponto flutuante são representados na forma big-endian enquanto inteiros são representados na forma little-endian. Existem processadores ARM que têm a representação de vírgula flutuante metade pequeno, metade grande para números de precisão dupla: ambas as palavras de 32 bits são armazenadas em registros pequenos como números 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 IEEE 754 big-endian como sua representação. Portanto, pode parecer estranho que o padrão IEEE 754 de vírgula flutuante não especifique a endianness. Teoricamente, isto significa que mesmo os dados de ponto flutuante do IEEE padrão escritos por uma máquina podem não ser lidos por outra. Entretanto, em computadores modernos padrão (ou seja, implementando o IEEE 754), pode-se, na prática, assumir com segurança que o endianness é o mesmo para números de ponto flutuante como para números inteiros, tornando a conversão simples, independentemente do tipo de dado. (Os pequenos sistemas incorporados que utilizam formatos especiais de vírgula flutuante podem ser outra questão.)
Dados de comprimento variávelEditar
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 dos operandos disponíveis são 1, 2, 4, 8, ou 16 bytes. Mas também existem arquiteturas onde o comprimento de um operando pode ser mantido em um campo separado da instrução ou com o próprio operando, por exemplo, por meio de uma marca de palavra. Os tipos de dados de tais operandos são cadeias de caracteres ou BCD.
Máquinas sendo capazes de manipular tais dados com uma instrução (por exemplo, comparar, adicionar) são, por exemplo IBM 1401, 1410, 1620, System/3×0, ESA/390, e z/Arquitectura, todos do tipo big-endian.
OptimizationEdit
O sistema little-endian tem a propriedade de que o mesmo valor pode ser lido a partir da memória em comprimentos diferentes sem utilizar endereços diferentes (mesmo quando são impostas restrições de alinhamento). Por exemplo, uma localização de memória de 32 bits com conteúdo 4A 00 00 00 00
pode ser lida no mesmo endereço que 8 bits (valor = 4A), 16 bits (004A), 24 bits (00004A), ou 32 bits (0000004A), todos os quais retêm o mesmo valor numérico. Embora esta propriedade little-endian seja raramente usada diretamente por programadores de alto nível, ela é freqüentemente empregada por otimizadores de código assim como por programadores de linguagem assembly.
Em termos mais concretos, tais otimizações são o equivalente ao seguinte código C que retorna verdadeiro na maioria dos sistemas 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");
Embora não permitido por C++, tal tipo de código de perfuração é permitido como “definido pela implementação” pelo padrão C11 e comumente usado em código interagindo com hardware.
Por outro lado, em algumas situações pode ser útil obter uma aproximação de um valor multi-byte ou multi-word lendo apenas sua porção mais significativa ao invés da representação completa; um processador big-endian pode ler tal aproximação usando o mesmo endereço base que seria usado para o valor completo.
Optimizações deste tipo não são portáveis entre sistemas de diferentes endianness.
Ordem de cálculoEditar
Algumas operações em sistemas de números posicionais têm uma ordem natural ou preferida na qual os passos elementares devem ser executados.Esta ordem pode afetar seu desempenho em processadores e microcontroladores endereçáveis a bytes de pequena escala.
No entanto, processadores de alto desempenho normalmente buscam operandos típicos de múltiplos bytes na memória no mesmo tempo em que teriam buscado um único byte, de modo que a complexidade do hardware não é afetada pela ordenação dos bytes.
Operações iniciando pelo menos um dígito significativoEditar
Adição, subtração e multiplicação iniciam na posição do dígito menos significativo e propagam o transporte para a posição mais significativa subseqüente.Quando este primeiro byte contém o dígito menos significativo – o que equivale a pouco endívia, então a implementação destas operações é marginalmente mais simples.
Operações que começam no dígito mais significativoEditar
Comparação e divisão começam no dígito mais significativo e propagam uma possível carga para os dígitos menos significativos subseqüentes. Para valores numéricos de comprimento fixo (normalmente de comprimento 1,2,4,8,16), a implementação dessas operações é marginalmente mais simples em máquinas big-endian.
Operandos de comprimento variávelEditar
Muitos processadores big-endian contêm instruções de hardware para comparação lexicográfica de caracteres de comprimento variável (por exemplo o sistema IBM/360 e seus sucessores).
Operações sem impactoEdit
O transporte normal de dados por uma declaração de atribuição é, em princípio, independente da capacidade do processador.
Middle-endianEdit
Numeros outros pedidos, genericamente chamados middle-endian ou mixed-endian, são possíveis. Um exemplo fora da informática é a formatação padrão americana de data de mês/dia/ano.
PDP-endianEdit
O PDP-11 é em princípio um sistema little-endian de 16 bits. As instruções para converter entre os valores de ponto flutuante e inteiro no processador opcional de ponto flutuante do PDP-11/45, PDP-11/70, e em alguns processadores posteriores, armazenou valores de 32 bits de “comprimento inteiro de precisão dupla” com as metades de 16 bits trocadas da ordem little-endian esperada. O compilador UNIX C usou o mesmo formato para inteiros de 32 bits de comprimento. Esta ordenação é conhecida como PDP-endian.
Uma maneira de interpretar esta endianness é que ele armazena um inteiro de 32 bits como duas palavras de 16 bits em big-endian, mas as palavras em si são little-endian (E.g. “jag cog sin” seria “gaj goc nis”):
endereços crescentes → | |||||
0Bh | 0Ah | 0Dh | 0Ch | ||
0A0Bh | 0C0Dh |
Os valores de 16 bits aqui referem-se aos seus valores numéricos, não ao seu layout real.
Série Honeywell 16Edit
Os computadores da Série Honeywell 16 de 16 bits, incluindo o Honeywell 316, são o oposto do PDP-11 no armazenamento de palavras de 32 bits em C. Ele armazena cada palavra de 16 bits em ordem big-endian, mas junta-as de forma little-endian:
endereços crescentes → | |||||
0Ch | 0Dh | 0Ah | 0Bh | ||
0C0Dh | 0A0Bh |
Intel IA-32 descritores de segmentoEditar
Descritores de segmento de IA-32 e processadores compatíveis mantêm um endereço base de 32 bits do segmento armazenado em ordem little-endian, mas em quatro bytes não consecutivos, nas posições relativas 2, 3, 4 e 7 do início do descritor.