La description corrigée pour le fragment A est:
mov eax, 5 ; move 5 into register eax
add eax, ebx ; add contents of ebx to eax, changing eax
nop ; no operation
nop ; no operation
push ebx ; push contents of ebx onto the stack
nop ; no operation
pop ebx ; pop top of the stack into ebx
call [eax] ; call the subroutine pointed to at location [eax]
Les instructions nop
suivies de push ebx
suivie nop
suivi par pop ebx
à nouveau ne change rien (autre que de laisser l'ancienne valeur de ebx
à un emplacement disponible dans l'espace de pile). Donc, fonctionnellement (bien avec un nombre réduit de cycles CPU consommés et l'espace de code), cela équivaut à:
mov eax, 5 ; move 5 into register eax
add eax, ebx ; add contents of ebx to eax, changing eax
call [eax] ; call the subroutine pointed to at location [eax]
Fragment B est:
mov eax, 5 ; move 5 into register eax
push ecx ; push contents of ecx onto the stack
pop ecx ; pop top of the stack into ecx
add eax, ebx ; add contents of ebx to eax, changing eax
swap eax, ebx ; swap the contents of eax and ebx
swap ebx, eax ; swap the contents of eax and ebx
call [eax] ; call the subroutine pointed to at location [eax]
nop ; no operation
Permutation deux registres deux fois de suite n'a pas d'effet net , autre que de consommer des cycles CPU et de l'espace de code. Ainsi, le fragment B se résume fonctionnellement jusqu'à:
mov eax, 5 ; move 5 into register eax
add eax, ebx ; add contents of ebx to eax, changing eax
call [eax] ; call the subroutine pointed to at location [eax]
Fonctionnellement le même fragment A.
Ce que les instructions ne dépend de la syntaxe (Intel ou AT & T). Puisque vous semblez utiliser la syntaxe d'assemblage Intel, il est vrai que 'mov eax, 5' déplace un' 5' dans le registre 'eax'. Mais, 'ajouter eax, ebx' ajoute' ebx' à 'eax', pas vice versa. Donc, après cette instruction, le contenu de 'eax' est alors 5 plus tout ce que' ebx' était et 'ebx' est inchangé. – lurker