web-dev-qa-db-fra.com

Comment asm ("nop")? travaux?

Je rouge la définition de http://en.wikipedia.org/wiki/NOP mais j'ai toujours besoin d'une définition plus simple. 

Je suis tombé sur un code et je ne sais pas exactement ce qu'il fait:

switch (Something)
    {

        case this_one:
            asm ("nop");
            break;
        case other_one:
            asm ("nop");
            break;
        default:
            asm ("nop");
            break;
    }
13
Alexandru Cimpanu

nop est une instruction d'assemblage qui ne fait rien - et presque aussi rien que vous pouvez le faire et qui exécute quand même une instruction machine, ce qui signifie (probablement) un VRAI PEU de temps (qui peut avoir une valeur limitée dans certaines applications temps réel).

Dans ce cas, l'instruction asm("nop"); ne fait aucune différence sémantique par rapport au programme. La seule raison pour laquelle je peux penser qu'il est peut-être présent est de "forcer" le compilateur à NE PAS réduire les chemins de code, rendant visible la structure de l'instruction switch si vous examinez le code de l'objet ou désassemblez-le ou affichez-le dans. un débogueur.

15
Dwayne Towell

NOP est utile pour le débogage. Même si vous ne faites rien car "aucune opération" signifie, NOP est une instruction sur ce que vous pouvez définir comme point d'arrêt dans le débogueur. Je crois que le programmeur voulait apprendre la valeur de "Quelque chose" de cette façon. Cela semble stupide mais il a fallu des heures à un programmeur expérimenté pour comprendre pourquoi

if(Something);
{
 ...
}

était toujours aller à l'intérieur de la portée ne dépendant pas de la valeur de Something. Je soupçonne que quelqu'un a eu le même problème avec switch () maintenant. Si le programmeur omet NOP, le compilateur peut plus facilement supprimer toute l'instruction switch(). J'utilise aussi __asm__("#start"); pour créer des bordures claires pour certains codes dans Vitesse maximale de IOS/iPad/iPhone mais __asm__("nop"); ferait de même.

Comme déjà dit, il peut également être utilisé pour des applications en temps réel. Par exemple, http://www.rickard.gunee.com/projects/video/pic/tetris.php pourrait utiliser ceci.

5
Tõnu Samuel

Comme personne ne l’a mentionné, nop peut également être utile pour "céder" une section critique, c’est-à-dire permettre à d’autres interruptions de se produire afin de réduire la latence des interruptions provoquée par la section critique.

Cela est généralement utile dans les applications intégrées sans système d'exploitation où vous devez souvent interroger des variables et/ou des registres d'état au cours d'une section critique.

Sur de nombreux processeurs RISC (ARM, AVR), l'instruction qui suit immédiatement le démasquage d'interruption sera toujours masquée. Ainsi, si vous ne mettez que sei/cli ensemble, vous ne laisserez aucune interruption se produire.

Chaque nop ajouté entre sei et cli permet une interruption supplémentaire avant la reprise de la section critique.

4
kuroi neko

Comme déjà mentionné, il a des utilisations dans le monde intégré. Parfois, il est nécessaire d’attendre un cycle ou deux avant qu’une broche ne soit réellement définie dans un certain état, notamment sur certains capteurs, etc. 0.7mhz ... Ce qui est dit à propos des interruptions est également vrai. 

4
Dare The Darkness

NOP est une instruction d'assemblage qui signifie (aucune opération) comme il est dit: cela ne fait tout simplement rien, mais il est traité par la CPU comme toute autre instruction ..__ Cela signifie donc qu'il sera lu de la mémoire, incrémentera le pointeur d'instruction, mais dans la phase d'exécution après le décodage d'instruction, rien d'autre ne sera fait . Il est fréquemment utilisé par les crackers en ingénierie inverse, mais je ne sais pas pour un autre usage qu'il aura . pense qu'il est nécessaire d'utiliser une instruction NOP dans la programmation en C. 

4
sir psycho sexy

Sur Intel x86 atleast, nop est un mnémonique pour xchg eax,eax, il échange donc le registre eax avec lui-même . Il existe d'autres formes qui font la même chose mais prennent plus d'espace (par exemple. lea esi,[esi + eiz] - ajoute 0 à esi), mais ce ne sont pas les instructions "officielles" nop.

1
Ketan Kanishka

nop est une instruction informatique qui ne fait rien. Dans ce cas particulier, c'est probablement là pour empêcher l'optimisation du commutateur. Cette implémentation est au mieux spécifique au compilateur, car rien ne l’empêche d’analyser et d’optimiser les instructions asm.

Pourquoi on ferait ça? Ce pourrait être pour tester d'une manière ou d'une autre la génération de code machine. Fonctionnellement, ce n'est pas utile.

0
Per Johansson