Ir para conteúdo
  • Cadastre-se
Entre para seguir isso  
fredericopissarra

Seu compilador não usa algumas instruções tradicionais. Por quê?

Posts Recomendados

Já reparou que o GCC (e o VC++, bem como outros compiladores) não usam instruções tradicionais como INC, DEC e LOOP?

INC e DEC são bem fáceis de entender e, por conseguinte, são intuitivas: Elas incrementam e decrementam, respectivamente, um registrador ou conteúdo de memória. Já a instrução LOOP salta para um endereço se RCX (x86-64) ou ECX (i386) não forem 0, decrementando esse registrador antes de cada salto. O nome da função é intuitivo também...

O motivo do não-uso dessas instruções é que elas são mais lentas que as equivalentes... ADD e SUB, com o operando fonte imediato 1, é 1 ou 2 ciclos mais rápida que INC e DEC porque essas últimas não preservam o flag de Carry (CF). Elas efetivamente fazem um ciclo de leitura-modificação-escrita nos flags... E LOOP é mais lento que a sequência: SUB ECX,1/JNZ ... Essas duas instruções podem ser "fundidas" (micro-fusão), gastando, em certos casos, menos que 1 ciclo...

Outro detalhe é que o seu compilador sempre prefere lidar com registradores de 32 bits (EAX, EBX, ...) ao invés de 8, 16 ou 64. Ele só lidará com registradores menores se não tiver jeito e, maiores, se estiver lidando com cálculo de endereços efetivos (porque a instrução não exigirá um prefixo 0x67)... Tenha em mente que seu processador, mesmo tendo uma extensão de 64 bits, é, ainda, de 32... Para acessar pedaços dos registradores é necessário algum mascaramento interno que consumirá algum tempinho (ou seja, MOV AX,2 é mais lento que MOV EAX,2, por exemplo). Por isso, em C, sempre que possível, use os tipos int ou unsigned int ao invés de char, short e long (ou long long)...

Este é outro motivo pelo qual, às vezes, você vê o uso de instruções como MOVSX e MOVZX para estender um dos aliases de registradores, como:

movsx eax,al

Que parece não fazer muito sentido... trata-se apenas da conversão de um char num int.

Seu compilador também não usa outras instruções como XLAT e JECXZ pelo mesmo motivo (lentidão).

  • Agradecer 1
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons no total são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...