Movimentação de bits e registradores

3 respostas
O

Meu professor de Arquitetura de computadores falou em uma aula que o processador movimenta sempre a quantidade de total de bits. Sitou até uma operação de MOV onde todos os 32 bits de um processador de 32 bits são sempre movidos.

Maaaaas, os processadores (ao menos o padrão Intel) possuem tb registradores de 16 e 8 bits, que são 1/2 e 1/4 de um mesmo reg. de 32 bits.

Pergunto:

    • Então como se dá uma movimentação entre registradores de 8 bits, já que serão sempre 32 bits movidos? Indo mais além, uma movimentação entre bits no mesmo registrador, como: MOV AL, AH ? Como os bits mais significativos não são zerados? Uma possível solução q eu vejo, seria usar ANDs, uma máscara, um registrador extra e/ou a pilha:
    • Com certeza o processador terá trabalho extra com dados menores, OK? Isso justifica algumas dicas de otimização que dizem para usar variáveis de tamanho maior para cálculos que precisam ser muito rápidos, como: int ao invés de short e double ao invés de float ??

3 Respostas

E

Bom, como você deve saber, os registradores são batizados na arquitetura AMD64 (também conhecida como Intel-EM64T) como:

RAX - o primeiro registrador de 64 bits.
EAX - A metade inferior (32 bits) do registrador RAX.
AX - a metade inferior (16 bits) do registrador EAX.
AH, AL - respectivamente, a metade superior e a inferior do registrador.

O programador Assembly de um processador na arquitetura AMD64 normalmente não deve se preocupar tanto se os dados são movidos 64 ou 32 ou 16 ou 8 bits de cada vez, principalmente entre registradores.
Por exemplo, uma instrução MOV AH, AL (8 bits) leva tanto tempo quanto uma instrução MOV RBX, RAX (64 bits), e se ele implementa isso efetuando algum mascaramento ou outra coisa isso não importa muito para você - na verdade o processador pega essa instrução MOV AH, AL e a transforma em uma subinstrução em uma “VLIW” (very large instruction word") que será executada de uma vez só. É por isso que você pode ver que às vezes o processador pode processar 8 instruções simultaneamente em um mesmo clock. É por causa de uma mágica dessas que é feita pelo processador.

(Eu estou falando em 64 bits, já que é o que você terá de aprender, mas em 32 as coisas são bem parecidas.)

Na verdade, cada família de processadores da Intel ou da AMD se comporta internamente de formas um pouco diferentes uma da outra, e é interessante sempre ler alguns materiais da Intel ou da AMD sobre a estrutura interna desses processadores. Basta ir ao site da Intel ou da AMD …

E

Outra mágica que não te contaram é o seguinte: em um processador como um Intel Core i7 ou um AMD Opteron, embora você (como programador Assembly) enxergue apenas alguns registradores, na verdade há muitos mais; é o processador que se vira com eles - esse recurso se chama “register renaming”.

Portanto, só de inspecionar um programa Assembly, você na verdade não sabe exatamente quanto tempo ele vai levar, e por conseguinte você não precisa se preocupar em “MOV AH, AL” ser mais lento que um “MOV RBX, RAX”. É que na verdade a movimentação física necessária para implementar essa instrução depende, por exemplo, das instruções anteriores e posteriores a essa instrução. O processador pode até alterar a ordem das instruções executadas, para que certas dependências entre instruções sejam resolvidas, e às vezes pode até cancelar algumas instruções se ele julgar que não terão resultado.

O

Amigão,

Muito obrigado pela resposta,

é por isso que o GUJ é melhor dos foruns,

espero também poder ajudar quando puder

Abraço

Criado 29 de setembro de 2011
Ultima resposta 30 de set. de 2011
Respostas 3
Participantes 2