Comment puis-je convertir Intel 80386 Code Machine Langage d'Assemblage?
Que j'ai été donné la tâche suivante:
Considérer la séquence suivante de valeurs hexadécimales:
55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3
Cette séquence d'octets représente une sous-routine dans 80386 d'Intel langage machine en mode 32 bits.
- Lorsque les instructions de ce sous-programme sont exécutés, ils laissent les valeurs dans le registre %ecx et %edx. Quelles sont les valeurs?
- Qu'est-ce que le programme en C qui effectue le calcul fait par ce sous-programme, puis imprime les valeurs calculées par ce programme, %ecx et %edx comme ils apparaissent à la fin de l'exécution de la sous-routine.
Que je n'ai pas le 80386 jeu d'instructions mémorisées, je dois d'abord convertir ces opcode octets dans leur langue de l'assembly mnémonique équivalents. Alors, est-il une référence en ligne quelque part, d'une table de mappage des valeurs hexadécimales pour les instructions ou autres? J'ai vérifié Intel site web, mais n'a rien pu trouver. Ou est-il une meilleure façon de déchiffrer ce que...?
OriginalL'auteur Ray | 2010-01-31
Vous devez vous connecter pour publier un commentaire.
Alors que vous pourriez triche et l'utilisation d'un dissassembler (un désassembleur ne serait pas très l'aide à l'apprentissage), je vous recommande effectivement apprentissage quelque chose en lisant les chapitres correspondants dans le Intel 80386 manuel. Démarrer avec le Chapitre 17. Si/lorsque vous êtes coincé, revenir à StackOverflow et poser une question en indiquant exactement à quelle distance vous avez obtenu ce que vous ne comprenez pas.
Oui c'est de la triche, si vous êtes à essayer de comprendre machine opcodes/leur encodage et traductions pour un langage de haut niveau (opcode -> assemblée -> C). Si le seul point de la mission était de comprendre les instructions, puis le professeur doit avoir commencé avec l'assemblée de la langue pas en code machine. C'est pourquoi je crois que l'intention de la mission est de saisir un peu de code machine qui n'est pas que difficile.
Si je voulais que mes élèves apprennent le codage d'instruction pour une architecture particulière, j'aurais demandé à écrire un désassembleur, pas de décoder les choses en main. Je ne pense pas que tout sain d'esprit de l'enseignant donnera une telle devoirs pour les besoins de l'instruction de codage. Je suppose que le but des devoirs consistait à suivre les instructions. En passant, j'aurais opté pour quelque chose de plus élégant que x86 pour leur enseigner l'instruction des codages. L'instruction x86 encodage est trop complexe pour être adapté à l'apprentissage.
Non, je ne suis pas. Mais je me réserve le droit d'exprimer mon opinion personnelle et de neutraliser la bêtise (dans le cas où ce que vous pensez est le but des devoirs, que je n'assume pas d'être vrai) autant que je le peux.
J' donné vous un lien qui pourrait vous aider énormément. Avez-vous pris la peine de lire? Je dirais au moins essayer de décoder une ou deux instructions dans une tentative pour au moins gagner quelque chose en plus de l'affectation de oui, j'ai posté sur stackoverflow et ils m'ont dit de télécharger un désassembleur, mais je n'ai même pas eu à le faire parce qu'ils ont affiché les démonté octets pour moi.
OriginalL'auteur
Vous devez utiliser un désassembleur pour voir quelles sont les consignes. Vous pouvez saisir NDISASM de la MSNA paquet. Stocker les octets dans un fichier et de l'exécuter:
Mehrdad, je n'ai pas le fichier d'assemblage, juste les Opcodes dans l'Hex.
Utiliser un éditeur hexadécimal pour entrer dans l'hex valeurs dans un fichier. Google éditeur hexadécimal pour celui qui convient à votre plate-forme.
Carroll - je pense que votre commentaire est offensant et hors ligne. Vous vous êtes trompé de comprendre et de mal interpréter ce qui a été dit dans ce fil que le post avec le démonté octets a été supprimé (Merci!). Me disant des choses comme "grandir" est enfantin. Je ne suis pas contre les devoirs des questions. Tout à fait le contraire. J'essaye de faire de mon mieux pour aider l'OP apprendre sans être voté sur StackOverflow. En fait, je l'invite à publier de nous dire où il est coincé à la prochaine, de sorte que nous pouvons l'aider. Dans un effort pour encourager l'apprentissage, flagrant réponses/aide aux devoirs questions ne devrait jamais être donné.
ici: comme vous pouvez le voir, en utilisant le désassembleur enseigne deux nouvelles choses pratiques pour l'op: éditeurs hexadécimaux et désassembleurs sur son propre. donc, ce n'est pas trop mauvais pour utiliser un désassembleur pour cette tâche 😉
OriginalL'auteur Mehrdad Afshari
Je ne voudrais pas utiliser un désassembleur, passer par le manuel d'instruction et de déterminer ce que chaque groupe de bits pourrait signifier. Ainsi, vous obtenez le correspondant des instructions de montage. À partir de là, il ne devrait pas être trop difficile à obtenir que dans C. je suis d'accord avec les autres affiches que c'est foiré faire cette mission en x86. Quelque chose comme SPARC ou MIPS serait beaucoup plus facile (comme ceux-ci ont une largeur fixe les instructions).
OriginalL'auteur Polaris878
Il y a une méthode beaucoup plus simple que celles proposées, et je soupçonne que c'est celle que l'enseignant a à l'esprit:
Décodage opcodes à partir du tableau est très, très pénible, et je serais surpris si c'était ce qui était prévu.
Vrai. Est-t-il un équivalent interactive "assembleur" outil sous *nix?
Ou bien, les autres réponses sont en supposant que Linux alors qu'en réalité, c'est une machine Solaris 🙂
ndisasm est portable et fonctionne sur Windows et Linux. Je upvoted Mehrdad de réponse.
OriginalL'auteur egrunin
Utilisation objdump -d si vous utilisez Unix.
OriginalL'auteur 0fnt
x /i
uniquement besoin de l'autorisation de lecture. Ou vous pourriez utiliser seulement compiler avecgcc -zexecstack
, ou mettreconst char code[] =
à la portée globale de sorte qu'il sera un symbole de la.rodata
section dans le segment de texte.OriginalL'auteur francogrex