2017-08-26 3 views
0

Je suis très nouveau à l'assemblée et maintenant j'essaye de comprendre comment cmp fonctionne. Voici ce qui est écrit dans wiki:Comprendre l'instruction de cmp

cmp arg2, arg1 

effectue une opération de comparaison entre arg1 et arg2. La comparaison est effectuée par une soustraction (signée) de arg2 de arg1, dont les résultats peuvent être appelés Temp. La température est ensuite supprimée.

Qu'est-ce que cela signifie "Temp est ensuite supprimé"? Où est-il stocké? Comment puis-je accéder à ce résultat de la comparaison? Quelqu'un peut-il l'expliquer?

+0

@Carcigenicate * ax? Cos AFAIK c'est souvent utilisé avec 'je'. Mais je dois savoir si la condition était vraie ou fausse. –

+1

Notez que vous faites référence à * wikibooks *, qui est une collection particulière de * wikis *. Un * wiki * est juste un type de site Web que les utilisateurs peuvent modifier. Et en tant que tel, wikibooks n'est certainement pas la principale ressource pour les définitions d'assemblages x86 (celle-ci est un bon exemple pourquoi il est parfois préférable de s'appuyer sur une documentation experte que la documentation générée par l'utilisateur). Utilisez google pour trouver une autre source, et interprétez cela! –

+1

'je' n'a pas besoin de savoir si la condition est vraie ou fausse,' je' est l'alias de 'jz', et' jz' est 'jump si zero flag' est positionné. Donc quelle que soit la dernière instruction qui ait modifié le ZF, celui-ci prédit que le prochain 'je' prendra un saut (ZF = 1) ou non (ZF = 0). Une des conséquences amusantes des nouveaux programmeurs asm qui ne l'obtiennent pas, est d'écrire du code comme 'sub ax, 1'' cmp ax, 0' 'jne myLoop' ... que' cmp' n'est pas nécessaire, comme précédent 'sub' mettra déjà ZF de manière suffisante pour ce travail 'jne' (mais plus logique serait d'utiliser l'alias' jnz myLoop', c'est-à-dire que l'on lit comme "jump not zero loop" - presque anglais. – Ped7g

Répondre

4

cmp arg2, arg1 effectue la même opération que sub arg2, arg1sauf qu'aucun des opérandes n'est modifié. La différence n'est pas enregistrée partout.

Cependant, les drapeaux registre est mis à jour et peut être utilisé dans un saut conditionnel, comme Saut si égal (JE), le plus souvent que l'instruction suivante après la cmp.

L'avantage par rapport aux autres instructions est que vous pouvez comparer deux valeurs sans en détruire aucune. Si vous avez fait sub arg2, arg1 et qu'ils sont égaux, l'un d'entre eux serait zéro après. Avec cmp ils sont tous les deux toujours là.