Je me demandais ce que sont les "NOP sémantiques" dans l'assemblage?Assemblage: que sont les NOP sémantiques?
Répondre
Code qui n'est pas un nop réel mais n'affecte pas le comportement du programme.
En C, la séquence suivante pourrait être considérée comme un NOP sémantique:
{
// Since none of these have side affects, they are effectively no-ops
int x = 5;
int y = x * x;
int z = y/x;
}
Un NOP sémantique est une collection d'instructions en langage machine qui ont aucun effet du tout ou presque pas d'effet (la plupart des instructions changement codes de condition) dont le seul but est d'obscurcir ce que le programme est en train de faire.
Code qui s'exécute mais ne fait rien de significatif. Ils sont également appelés "prédicats opaques" et sont utilisés le plus souvent par obfuscators.
Ce sont des instructions qui n'ont aucun effet, comme un NOP, mais prennent plus d'octets. Utile pour aligner le code sur une limite de ligne de cache. Une instruction comme lea edi, [edi + 0] est un exemple, il faudrait 7 NOPs pour remplir le même nombre d'octets mais prend seulement 1 cycle au lieu de 7.
Un vrai "sémantique nop" est une instruction qui n'a pas d'autre effet que de prendre du temps et d'avancer le compteur de programme. Beaucoup de machines où les mouvements de registre-à-registre n'affectent pas les drapeaux, par exemple, ont de nombreuses instructions qui vont déplacer un registre sur lui-même. Sur le 8088, par exemple, une des conditions suivantes seraient NOP sémantiques:
mov al,al mov bl,bl mov cl,cl ... mov ax,ax mob bx,bx mov cx,cx ... xchg ax,ax xchg bx,bx xchg cx,cx ...
Notez que tous les ci-dessus à l'exception de « hache xchg, hache » des instructions à deux octets. Intel a donc déclaré que "xchg ax, ax" devrait être utilisé lorsqu'un NOP d'un octet est requis. En effet, si l'on assemble "mov hache, hache" et qu'on le démonte, il se démontera comme "NOP". Notez que dans certains cas, une instruction ou une séquence d'instructions peut avoir des effets secondaires potentiels, mais néanmoins être plus souhaitable que le "nop" habituel. Sur le 6502, par exemple, si l'on a besoin d'un délai de 7 cycles et que le pointeur de pile est valide mais que la valeur de pile n'est pas pertinente, un PHP suivi d'un PLP tue sept cycles en utilisant seulement deux octets de code. Si la valeur de début de pile n'est pas un octet de mémoire vive, la séquence échouera.