Ir para conteúdo

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


fredericopissarra

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).

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...