2016-03-13 3 views
0

Je ne suis pas sûr de ce que ce qui suit est censé faire mais c'est ce que j'ai obtenu jusqu'ici.Que fait réellement le code d'assemblage suivant?

enter image description here

mov eax, 5  (move 5 into register eax) 
add eax, ebx  (add 5 from eax to 0 from ebx and store in eax) 
nop    (no operation) 
nop    (no operation) 
push ebx   (push 0 onto the hardware stack) 
nop    (no operation) 
pop ebx   (pop the 0 from off the stack and store in ebx) 
call [eax]  (get the 5 from eax) 
+0

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

Répondre

4

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.

+0

Votre description de l'instruction 'call' n'est pas correcte. C'est un appel indirect à la mémoire, donc 'EAX' est seulement l'adresse du pointeur de fonction, pas la valeur (l'emplacement du sous-programme lui-même). 'EIP = [EAX]', pas 'EIP = EAX'. –

+0

@PeterCordes oui bonne prise. J'étais un niveau d'indirecte. – lurker

+0

Vraiment utile, merci beaucoup pour cette explication, je suis définitivement sur mon chemin pour comprendre pleinement, une chose m'échappe toujours vous avez dit appel [eax] signifie appeler le sous-programme pointé à l'emplacement [eax], mais de quel sous-programme parlez-vous et d'où vient-il que le [] autour du registre signifie quelque chose de spécial? –

1

Deux fragments de code font appel indirect par EAX. Si la valeur EBX dans les deux fragments est la même, le même code sera appelé car les deux fragments ajoutent ebx à eax.