push %ebp mov %esp,%ebp sub $0x28,%esp
5 Réponses :
La quantité d'octets est la différence d'adresses entre les instructions adjacentes: si vous n'avez que du texte, allez ici: http://www.swansontec.com/sintel.html et ici: http://faydoc.tripod.com/cpu/conventions.htm et calculez pour chaque instruction, préfixe et opérande p> p>
Si vous avez le code de montage dans le texte, vous devrez utiliser une routine d'assembleur pour obtenir le
représentation binaire, et donc la taille des instructions. Bien sûr, c'est dépendant du matériel. p>
Par exemple, voici un assembleur 80x86 32 bits ouverte
La première instruction est à [Main + 0] et la seconde est à [Main + 1] de sorte que la première instruction est de 1 octet. La troisième instruction est à [Main + 3], la deuxième instruction est de deux octets. Vous ne pouvez pas dire à la liste de la longueur de la troisième instruction, car elle ne montre pas l'adresse de la 4. Instruction. P>
Vous ne pouvez pas nécessairement déterminer la taille d'instructions à partir du mnémonic. Voici quelques cas spéciaux: p>
Si vous êtes dans un segment de 16 bits, en mode 32 bits ou 16 bits Vous pouvez encoder L'opérande de mémoire en mode 64 bits Vous pouvez utiliser le préfixe REX Les dérogations de segment peuvent être utilisées, même si le segment explicite est identique à celui implicite. P> li>
ul>
Il existe de nombreuses autres façons d'encoder une instruction en utilisant plus ou moins d'octets. Un bon assembleur devrait probablement toujours utiliser le plus court, mais ce n'est certainement pas requis par l'architecture. La bonne chose est que si vous étudiez le volume 2 du manuel du développeur de logiciels Intel IA-32, vous devriez pouvoir le calculer vous-même. P> MOV EAX, 0 code> nécessite un
0x66 code> préfixe, tandis que dans un segment 32 bits, il ne " t. Vous devez connaître la taille du segment. P> li>
Ajouter EAX, 1 CODE> comme
0x40 code> (
Inc EAX code>) ou
0x83 0xc0 0x01 code> (
Ajouter EAX, 1 CODE>). C'est-à-dire que certains mnémoniques peuvent être codés de plus d'une manière. P> li>
[ex] code> peut encoder
EAX code> comme la base ou l'index. Si c'est l'index, vous aurez un octet de sib supplémentaire après le MOD / RM. P> LI>
0x4x code> pour encoder les registres
R8 code> -
r15 code>. Cependant, vous pouvez utiliser
0x40 code> comme une sorte d'octet NULL REX, qui ajoutera un autre octet à votre instruction. P> li>
En effet, le codage d'instructions, en particulier sur x86 / x64, est ambigu, tous deux en ce sens que deux mnémoniques de montage peuvent décrire la même instruction ( xchg hache, hache code> et
nop code>), et qu'il pourrait y avoir deux opcodes binaires pour un assembly mnemonic (
inc ex code> dans 32bit - les deux
0x40 code> et
0xff 0xc0 code>). Ils sont même parfois délibérément ambigus pour une raison, comme
nop code> instructions, voir Stackoverflow.com/questions/2123000/...
De nombreuses nouvelles instructions peuvent également être recodées avec un préfixe VEX ou EVEX, de sorte qu'ils auront plusieurs représentations avec une longueur différente
@ Lưuvĩnhphúc: Ce n'est pas assez précis. Les instructions SSE codées comme AVX à l'aide de Vex ou Evex ont un comportement légèrement différent: * Ils ont des exigences d'activation différentes. Par exemple, Vex nécessite CR4.OSXSAVE et divers bits dans Xcr0. * 128 bits AVX Instructions Effacez les bits supérieurs du YMM ou de la ZMM, tandis que les instructions SSE correspondantes laissent les bits supérieurs intacts
Si possible, l'assembleur génère une liste. Cela montrera votre code source et à côté de la représentation binaire des instructions et tout ce que vous avez à faire est de compter combien d'octets il y a et vous avez ensuite la taille. P>
Vous le voulez au moment de l'exécution? Ie
ASM_SIZE ("MOV ESP, EBP") CODE>?
Ce genre de choses est une architecture matérielle dépendante. Ce n'est pas un problème de "analyse", mais un "Dictionnaire" Rechercher un "Problème" approprié "".
À Linux, vous pouvez utiliser
objdump -d exécutable-fichier code> pour voir les opcodes, vous verrez la taille de chaque instruction.
ReverseGineering.stackexchange.com/Questions/ 5 / ...