2010-08-13 15 views
4

Im essayant actuellement d'écrire un désassembleur. J'ai trouvé la liste suivante des opcodes et leur signification, alors j'ai décidé de l'analyser à l'exécution: http://mprolab.teipir.gr/vivlio80X86/pentium.txtx86 codage d'opcode: octet de sib

Mais je suis coincé à l'opcode 0x00: Il est suivi par un reg/modbyte. L'analyser n'était pas vraiment un problème pour moi. Mais j'ai des problèmes avec le Scale-Index-Byte: Si vous spécifiez en particulier esp comme registre d'index, cela signifie en réalité qu'il n'y a pas de registre d'index. La même chose s'applique pour le registre de base avec ebp. Mais je l'ai essayé avec C++ assembleur en ligne: Il est possible de compiler: "ajouter [ebp * 2 + ebp], cl"

Alors comment peut-on utiliser ebp comme registre de base quand on utilise ebp comme registre de base signifie utiliser aucun registre de base du tout!

Répondre

6

Le cas "EBP manquant" s'applique uniquement dans le cas où le champ ModR/M.Mod a la valeur 00 binaire. Si vous avez besoin RASE comme base, l'assembleur change Mod à 01 binaire et ajoute déplacement 8 bits avec la valeur zéro:

004C6D00 ajouter [ebp + ebp * 2], cl

+0

Ok sont là d'autres disparus registres pour les valeurs de déplacement 8bit et 32bit alors? Y a-t-il d'autres étranges inhabituelles? – Zotta

+1

Seul EBP est "manquant". Notez que vous pouvez encoder [déplacement] pur addresing à cause de "manque index ESP" et "manque de base PAAS" de deux façons: 000D 78563412 add [12345678], cl 000C25 78563412 add [12345678], cl Cependant, Mode 64 bits, le premier opcode signifie: 000D 78563412 ajouter [rip + 12345678], cl EDIT: merde, sauts de ligne ont été mangés ce qui rend le commentaire moins lisible. – MazeGen

+0

Ok, maintenant ça marche. Grand merci! – Zotta