“nop; jmp curto ”vs.“ jmp curto; nop ”

2

Ok, primeiro deixe-me ver se entendi: não se trata de otimização micro.

Mas, eu sei em bootloaders na partição, muito uso a codificação jmp short; nop . Mas é do meu entendimento que quanto menos um jmp "salta" :), menos ciclos são necessários para o processador completar, e alguns processadores vêem o 0x90 e simplesmente o ignoram sem avaliá-lo.

    
por Cole Johnson 05.06.2012 / 15:52

1 resposta

2

Você pode querer dar uma olhada nos Manuais do desenvolvedor de software de arquiteturas Intel 64 e IA-32 , eles são um ótimo recurso para entender a arquitetura x86 do ponto de vista de um programador (supondo que você já esteja confortável com a montagem).

[...] my understanding that the less amount that a jmp "jumps" :) the less cycles it takes for the processor to complete

Você precisa diferenciar entre saltos próximos e distantes. Saltos próximos simplesmente adicionam (ou subtraem através da matemática do complemento de 2) um deslocamento para o ponteiro de instrução (IP) ou recarregam o deslocamento IP do segmento de código atual (CS). Saltos próximos geralmente podem armazenar o deslocamento na própria palavra de instrução, ou um registrador - para que toda a instrução de salto possa ser buscada em um ciclo.

Jumps distantes armazenam o novo endereço real do ponteiro de instrução na palavra next ou em um local da memória, portanto, isso exige uma busca adicional - e, portanto, leva mais tempo. Em x86 e x86-64, você pode não saltar para um local mantido em um registrador (deve ser a próxima palavra de instrução ou em um local na memória).

and some processors see the 0x90 and just skip it without evaluating it.

Sim, essa é a definição do que uma instrução NOP deve fazer. A CPU ainda precisa buscar o 0x90 opcode, mas a avaliação não faz nada essencialmente.

    
por 05.06.2012 / 15:59