Comment interpréter l'opcode manuellement?
77f4bcbc 8945fc mov dword ptr [ebp-4],eax
Et voici la règle:
88 /r MOV r/m8,r8 2/2 Move byte register to r/m byte
89 /r MOV r/m16,r16 2/2 Move word register to r/m word
89 /r MOV r/m32,r32 2/2 Move dword register to r/m dword
Comment interpréter 8945fc
à mov dword ptr [ebp-4],eax
?
source d'informationauteur kern | 2011-05-16
Vous devez vous connecter pour publier un commentaire.
Nous avons ici un à trois octets instruction: 89 45 fc. Le premier octet est l'opcode de l'octet. Le recherchant dans la table, nous pouvons voir que c'est une instruction MOV et il faut un Mod R/M octets. Le Mod R/M octet a la disposition suivante:
Regardons le deuxième octet de l'instruction. 0x45 est 01.000.101 en binaire. Ainsi, le Mod est 01, Reg est 000 et R/M est de 101.
Regardant vers le haut de la référence, par exemple icinous pouvons voir que la combinaison de Mod=01 et R/M=101 correspond à la [EBP+sbyte] opérande. Le "sbyte" est un 8-bit signé déplacement qui est codé dans le troisième octet: 0xFC. Puisque le déplacement est signé, il doit être interprété comme tel nombre, c'est à dire -4.
"/R" note à côté de l'instruction nous dit que le registre (deuxième) opérande spécifié par le Reg domaine de l'instruction. Reg=000 al/ax/eax. En supposant un mode 32 bits par défaut, cela signifie eax.
L'assemblage de tous les ci-dessus, nous obtenons
89
est l'opcode45
code source et de destinationfc
est le décalage (-4)Si vous souhaitez écrire votre propre désassembleur, ici est ce que vous avez besoin.
Pour un résumé rapide, look ici
recherchez mov dword ptr [ebp-4],eax vous avez 8 bits de code.vous pouvez l'obtenir facilement
voici la procédure
six premiers bits sont donnés ou doit être mémorisé pour mov commande, puis ajouter sur le LSB de la destination bits(D) où d=1 quand il s'agit d'un registre dans la destination ou d=0 lorsque le registre est dans la source.Ici, le registre eax est à côté source devrait donc ajouter 0, puis le dernier morceau qui est appelé bit de mot(W bits) est à ajouter dans le côté LSB après une destination peu où
W bits= 1 quand il y a 16/32 bits registre ou 0 quand il est 8 bits registre alors maintenant, en fonction de la commande "mov dword ptr [ebp-4],eax"
le bit d=0 et w bits =1
maintenant, vous obtenez les 8 bits de l'opcode
ensuite, vous devez trouver le MOD(R/M) champ.
pour cela, vous devez trouver les 3 choses.
1) mod valeur
2) la valeur de registre
3) R/M valeur
voici le format
+-----+---------+---------+
| Mod | Reg | R/M |
+-----+---------+---------+
comme mentionné dans la réponse ci-dessus
vérifiez ensuite dans la commande mov dword ptr [ebp-4],eax
il est 8 bits de déplacement selon -4 puis mod valeur =01
MOD VALEURS:
00 pour pas de déplacement
01 pour les 8 bits de déplacement
10 pour 16 bits displacment
11 pour vous inscrire pour vous inscrire transfert
donc ici
mod=01
alors
pour reg eax la valeur est 000
et pour (R/M), la valeur est de 101
de sorte que le R/M champ de 8 bits sont
01000101
espérons que cette description permettra