Informática Numaboa - Tutoriais e Programação
Processadores Intel e o Little Endian
Sab 20 Jun 2009 00:00 |
- Detalhes
- Categoria: Assembly Numaboa (antigo oiciliS)
- Atualização: Domingo, 21 Junho 2009 12:09
- Autor: vovó Vicki
- Acessos: 10089
A ordem reversa de armazenamentos de endereços é uma característica dos processadores Intel. Este é um assunto que você precisa dominar se pretende programar em Assembly e se quiser examinar dados e a memória do seu computador usando um debugger.
Basicamente, os processadores Intel guardam dados na memória "no avesso", ou seja, os dados são armazenados byte a byte em ordem reversa. A coisa se resume no seguinte: quando um byte é armazenado num endereço de memória a sequência de bits é mantida, mas quando um word, composto por dois bytes, é armazenado na memória, seus bytes serão armazenados em ordem reversa. Isto quer dizer que o byte menos significativo (o segundo) será armazenado primeiro, seguido pelo byte mais significativo (o primeiro).
Esta sequência "ao contrário" é chamada de formato little endian. A sequência na ordem correta é chamada de big endian e é usada por outros tipos de processadores.
É meio difícil explicar o little endian por meio de palavras - um exemplo torna a coisa bem mais fácil. Digamos que você queira armazenar o valor 248Ch no endereço de memória 400000h. A área de memória teria o seguinte aspecto:
Endereço | Valor |
---|---|
0040 0000 | 8C |
0040 0002 | 24 |
Quando este valor for lido da memória por uma instrução word, tendo como referência o endereço 400000h, os bytes serão lidos em ordem reversa e o registrador word (de 32 bits) indicado receberá o valor 248Ch. Se o armazenamento ocorre em ordem inversa e a leitura também, não tem com que se preocupar - o computador está fazendo o serviço direitinho. A única coisa é que precisamos saber disto para que, ao visualizarmos diretamente esta área da memória usando um debugger, saibamos que os bytes estão invertidos.
Para reforçar o conceito do mecanismo little endian usado pelos processadores Intel, vou exemplificar o armazenamento de um dword, digamos 12345678h também em 400000h:
Endereço | Valor |
---|---|
0040 0000 | 78 |
0040 0002 | 56 |
0040 0004 | 34 |
0040 0006 | 12 |
Agora você sabe o que é o little endian, não vai ficar confuso com ele. Mas por que cargas d'água o pessoal da Intel resolveu adotar este modo de armazenamento? Como tudo na vida, as coisas têm uma explicação lógica
Vamos simplificar o problema para entender a mecânica e a origem do little endian. Imagine a área de memória como uma enorme prateleira vazia. Se você tivesse que armazenar apenas um bit na memória, qual posição você escolheria? Não sei se sou muito folgada, mas se a memória estiver vazia eu escolheria a primeira prateleira livre que estivesse mais em baixo (se eu escolhesse a que estivesse mais em cima teria que buscar uma escada e subir até o topo da prateleira). Agora vamos ampliar nosso modelo teórico: já temos um bit armazenado e queremos guardar um segundo bit. O que é mais fácil? Deslocar o primeiro bit para a segunda prateleira e colocar o segundo bit na primeira ou simplesmente colocar o segundo bit na segunda prateleira? Novamente, movida pela lei do mínimo esforço, eu optaria por colocar o segundo bit na segunda prateleira.
Ao invés de pensar em bits, vamos agora pensar em bytes (conjuntos de 8 bits). Se tivermos apenas um byte para colocar na memória vazia, vamos alocá-lo no início; se tivermos um segundo byte, seguindo o raciocínio do modelo dos bits, ao invés de deslocar o primeiro byte para inserir o segundo no início da memória, o segundo byte vai para a segunda prateleira. Taí! Novamente escolhemos a solução mais fácil e rápida... só que, para obter o valor original, vamor ter que ler os bytes na ordem inversa em que foram colocados.
... | ... | |
---|---|---|
3 | milhar | 5 |
2 | centena | 4 |
1 | dezena | 8 |
0 | unidade | 7 |
Para aqueles que se embananam com bits e bytes, vou dar mais um exemplo usando o sistema decimal. Sabemos que valores decimais são expressos em unidades, dezenas, centenas, etc. Se quisermos guardar o número 5.487 na prateleira da memória, começamos guardando as 7 unidades, depois as 8 dezenas, as 4 centenas e finalmente os 5 milhares. Nós e o computador guardamos os "pedaços do número" desta forma, de baixo para cima. Na hora de recuperar o valor original, o computador busca os "pedaços" na mesma ordem em que foram colocados na prateleira, ou seja, 7845. Como a máquina sempre guarda e lê as coisas da esquerda para a direita (ou de baixo para cima, como quiser), o valor original fica preservado. Acontece que o cérebro dos humanos foi condicionado a ver o número na ordem inversa, ou seja, 5487 precisa ser lido da esquerda para a direita (ou de cima para baixo). Ao invés de mudar a arquitetura da máquina para imitar um costume dos humanos, o little endian facilitou as coisas para o computador e deixou por conta dos humanos a inversão da leitura.
Não existe um modo mais certo ou mais errado de armazenar dados. Existe apenas um estilo e o pessoal da Intel escolheu o que acabei de explicar. Para dar nomes aos bois, este estilo foi chamado de little endian. Por dedução, o big endian é o estilo que desloca o primeiro para inserir o segundo byte. Dá um pouco mais de trabalho, exige um pouco mais de processamento, mas também dá certo. O pessoal da IBM escolheu usar o big endian. Com isto facilitou as coisas para os humanos exigindo um pouco mais da máquina. Certo ou errado? Diria que é apenas uma questão de estilo...