7
votes

Combien de byes est-elle compilée à l'assemblage X86?

push   %ebp
mov    %esp,%ebp
sub    $0x28,%esp

4 commentaires

Vous le voulez au moment de l'exécution? Ie ASM_SIZE ("MOV ESP, EBP") ?


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 pour voir les opcodes, vous verrez la taille de chaque instruction.


ReverseGineering.stackexchange.com/Questions/ 5 / ...


5 Réponses :


6
votes

La quantité d'octets est la différence d'adresses entre les instructions adjacentes: xxx

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


0 commentaires

0
votes

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.

Par exemple, voici un assembleur 80x86 32 bits ouverte code source ( OLLYDBG V1.10 ).


0 commentaires

1
votes

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.


0 commentaires

3
votes

Vous ne pouvez pas nécessairement déterminer la taille d'instructions à partir du mnémonic. Voici quelques cas spéciaux:

  • Si vous êtes dans un segment de 16 bits, MOV EAX, 0 nécessite un 0x66 préfixe, tandis que dans un segment 32 bits, il ne " t. Vous devez connaître la taille du segment.

  • en mode 32 bits ou 16 bits Vous pouvez encoder Ajouter EAX, 1 comme 0x40 ( Inc EAX ) ou 0x83 0xc0 0x01 ( Ajouter EAX, 1 ). C'est-à-dire que certains mnémoniques peuvent être codés de plus d'une manière.

  • L'opérande de mémoire [ex] peut encoder EAX comme la base ou l'index. Si c'est l'index, vous aurez un octet de sib supplémentaire après le MOD / RM.

  • en mode 64 bits Vous pouvez utiliser le préfixe REX 0x4x pour encoder les registres R8 - r15 . Cependant, vous pouvez utiliser 0x40 comme une sorte d'octet NULL REX, qui ajoutera un autre octet à votre instruction.

  • Les dérogations de segment peuvent être utilisées, même si le segment explicite est identique à celui implicite.

    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.


3 commentaires

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 et nop ), et qu'il pourrait y avoir deux opcodes binaires pour un assembly mnemonic ( inc ex dans 32bit - les deux 0x40 et 0xff 0xc0 ). Ils sont même parfois délibérément ambigus pour une raison, comme nop 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



0
votes

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.


0 commentaires