Comment un 2 pass-assembler les différents à partir d'un seul passage de l'assembleur dans la résolution de l'avenir des symboles?
Ce sont 2 questions que je ne comprends pas:
-
Comment le Un Passe-Assembleur résoudre le futur symbole de problème?
-
Comment est Deux passes Assembleur différent de celui de passer de l'assembleur à cet égard?
Résout-il dans le premier col ou de la seconde passe? Si il le fait lors de la seconde passe,où est-il réellement différent de celui qui-passe-assembleur? Si elle le fait dans le deuxième passage, pourquoi n'est-il pas le faire lors de la première passe?
Vous devez vous connecter pour publier un commentaire.
Lire ce PDF. Il explique, étape par étape, de façon simple et multi-pass assembleurs de travail. Il explique également les avantages et les inconvénients de chacun d'eux et les différences entre les deux.
Qu'est ce qu'un seul passage de l'assembleur?
C'est une sorte de Charge-and-go type d'assembleur qui généralement génère le code de l'objet directement dans la mémoire pour l'exécution immédiate! Il analyse par le biais de votre code source qu'une seule fois et votre fait. Vroom...
Cool, si il n'cette magie, pourquoi avons-nous besoin de multi-pass assembleurs à tous?
Références vers l'avant! ie alors que le passage de l'assembleur est trodding au long de votre code source, il a rencontré un étrangers dans le formulaire de données undefined symboles et labels non définis(saut d'adresses). Votre assembleur demande à ces étrangers qui sont-ils? Les étrangers disent " Nous vous raconterai plus tard!" (Référence vers l'avant) l'assembleur se met en colère et vous dit à éliminer totalement ces étrangers. Mais ces étrangers sont vos amis et vous ne pouvez pas les éliminer totalement. Si vous entrez dans un accord de compromis avec l'assembleur. Vous vous engagez à définir toutes les variables avant de les utiliser. L'assembleur ne pouvais pas faire de compromis sur ce point car il ne peut pas même de la réserve de stockage temporaire pour les données undefined symboles qu'il ne connaît pas sa taille. Les données peuvent être de tailles différentes
Si c'est quelque chose comme
De sa part, l'assembleur accepte de faire des compromis sur undefined sauter les étiquettes. Comme le saut étiquettes ne sont rien, mais les adresses et adresse de tailles peut être connu apriorique de sorte que l'assembleur peut réserver un certain espace pour le symbole non défini.
Si ses comme ce
Assembleur traduit
jump AHEAD
comme0x45 **0x00 0x00**
.0x45
est l'opcode dejump
et 4 octets réservés pourAHEAD
adresseOK, maintenant, dites-moi exactement comment l'on passe de l'assembleur travaille
Simple, tandis que sur son chemin, si l'assembleur rencontre un indéfini de l'étiquette, il le met dans la table des symboles ainsi que l'adresse où le symbole non défini la valeur doit être placé, lorsque le symbole est trouvé dans l'avenir. Il en fait de même pour tous les indéfini labels, et lorsqu'il voit les définitions de ces symboles non définis, il ajoute à leur valeur, à la fois dans la table ( ce qui rend cette étiquette définie ) et dans l'emplacement de mémoire où elle avait réservé temp de stockage plus tôt.
Maintenant à la fin de l'analyse, s'il y a plus de pauvres âmes encore en état indéfini, l'assembleur crie à l'injustice et une erreur 🙁 Si il y en a pas non défini étiquettes, puis vous partez!
L'un sec, j'ai oublié pourquoi nous avons besoin d'un 2 ou multi pass assembleur? Et comment fonctionnent-ils?
Comme l'a expliqué, un passe-assembleur ne peut pas résoudre en avant les références de données de symboles. Il exige que tous les symboles de données à être définies avant d'être utilisées. Un deux passe-assembleur résout ce dilemme en consacrant une passe exclusivement à résoudre tous (données/étiquette) références vers l'avant, puis de générer le code de l'objet, sans aucun souci dans le passage suivant.
Si un symbole dépend d'un autre, et ce à une autre dépend encore une autre, l'assembleur résolu ce de manière récursive. Si j'essaye d'expliquer même que dans ce post, la poste ne devienne trop gros. Lire ce ppt pour plus de détails
Hmm.. Intéressant. Ne les deux pass assembleur ont plus d'avantages?
Oui. Il peut détecter des redéfinitions et des choses comme ça.
PS: j'ai peut-être pas 100% correct ici. J'aimerais entendre des suggestions à en faire un meilleur poste.
Un seul passage de l'assembleur génère le code et pour tous les symboles non définis, les feuilles de logement à remplir, et mémorise dans une table ou une autre structure de données. Alors, où le symbole est défini, il remplit sa valeur au bon endroit ou à des endroits, en utilisant les informations de la table.
La raison pour l'utilisation de deux passes assembleur, traditionnellement, a été la cible de programme qui ne répond pas dans la mémoire, le laisser seul à la source. Le gigantesque programme source est lu ligne par ligne, à partir du coup de poing de lecteur de bandes, et le tableau des étiquettes est conservé dans la mémoire interne.
(J'ai fait que, sur ISIS, le premier système de développement d'Intel, avec une 8080.)
La deuxième fois autour de la bande source est de nouveau lu depuis le début, mais la valeur de toutes les étiquettes est connu, et que chaque ligne est en lecture, le programme cible est percé sur la bande. Sur une mémoire morte de faim 16 bits Intel 8086 système, c'était encore une technique utile d'avoir un très documenté fichier source qui peut être beaucoup plus de 64 Ko, avec disque dur ou disquette substitué à la bande de papier.
Aujourd'hui, il n'est pas nécessaire de faire deux passes, mais cette architecture est encore en usage. Il est légèrement plus simple, au détriment de I/O.
Une façon de penser à assembleurs, c'est d'imaginer qu'ils calculent la valeur d'une série d'expressions attribué séquentiellement l'augmentation des emplacements de mémoire. Les expressions peuvent classiquement être constituée de la valeur d'un symbole, d'arithmétique fait sur des symboles, des constantes et des variables telles que la "position actuelle du compteur" (souvent écrit avec un drôle de nom tel que "$"), ou vraiment propres expressions dont la syntaxe est celle d'instructions machine.
Noter qu'une expression peut produire une valeur qui remplit plusieurs séquentielle emplacements de mémoire; des instructions machines ont tendance à faire cela, mais il est utile d'avoir des expressions pour les littéraux de chaîne, multiprecision numéros, initialisé les structures, etc. Cela affecte uniquement de comptabilité de détail, mais ne change pas de ce que les assembleurs de faire dans l'abstrait.
Pour calculer la valeur finale de chaque expression, l'assembleur doit connaître la valeur de tous les symboles qui pourraient être impliqués. Il découvre des valeurs de symbole en quelques manières. Tout d'abord, le symbole de la valeur peut être définie comme le résultat d'une expression. Deuxièmement, la valeur du symbole peut être affecté à la valeur de la position actuelle du compteur; en général, les assembleurs de le faire quand un symbole est écrit dans "l'étiquette" de position. Sur cette découverte, l'assembleur enregistre le nom du symbole et de sa valeur dans la table des symboles à utiliser dans l'évaluation des expressions.
Un problème clé d'un assembleur de visages est la production de la valeur d'une expression, n'ayant pas encore rencontré toutes les définitions de symboles. L'hypothèse est que si un symbole n'est pas définie dans certains ligne en particulier, il sera défini plus tard que l'assembleur finira par processus.
Deux passes assembleur cherche à calculer la valeur de chaque expression au moment de la rencontre, en deux passes appelé la "première" et "deuxième" passe. Lors de la première passe, si il y a des symboles non définis (probablement des références vers l'avant) dans l'expression, l'assembleur remplace simplement une valeur factice (souvent zéro); dans tous les cas, il calcule une valeur pour l'expression. Si une instruction machine ou de données constant est en cours de traitement, les résultats sont ignorés, mais le taille est utilisé pour faire avancer l'emplacement du comptoir pour permettre l'étiquette de la valeur de cession. Si une étiquette est rencontré, sa valeur est définie à l'emplacement actuel du compteur. Si un symbole d'affectation "UN EQU" est rencontré, le symbole de la valeur est le résultat de l'expression; si l'expression contient un symbole non défini, l'assembleur va émettre un message d'erreur. Si l'origine de l'énoncé "ORG ", elle est traitée comme si on écrivait "$ EQU ". À la fin de la première passe, toutes les étiquettes ont été affectées des valeurs; les symboles qui n'ont pas de valeurs sont marqués comme "non défini" dans la table des symboles. Un second passage répète l'évaluation de l'expression de la première, mais ne pas (re)définir les symboles; depuis, tous les symboles sont (devraient être) définies, l'expression de valeurs sont correctes et émis vers le flux de sortie. Tous les symboles non définis trouvé dans une expression de provoquer un "undefined symbol" plainte.
Un passe-assembleur cherche à calculer la valeur de chaque expression lorsqu'il rencontre l'expression. Si l'expression ne contient que des symboles définis, l'assembleur peut l'évaluer et produire de la valeur finale, et de l'écrire de l'information à ses flux de sortie. (Une autre réponse ici suggéré que certains une passe assembleurs d'écrire leur réponse à la mémoire. C'est juste un cas particulier). Si l'expression contient un symbole non défini, l'assembleur stocke une paire (emplacement,expression) être réutilisés plus tard, soit lorsque le symbole devient défini, ou à la fin de l'assemblée. Certaines expressions telles que celles de la définition de l'emplacement du compteur ne peut pas avoir les symboles non définis; l'assembleur va se plaindre dans ce cas.
Donc la partie la plus délicate est de stocker la non expression, et de décider du moment de la réévaluation. Une façon de stocker l'expression est de simplement garder le texte; une autre est de construire ce qui équivaut à un (inverse) polonais notation pour l'expression. Pour déterminer si l'expression doit être ré-évalué, on peut l'associer avec les symboles non définis, il contient; puis, quand un symbole est défini, le correspondant en suspens expressions sont ré-évalués, avec terminés émis, et non résolus à celles encore à gauche pour le retraitement. Sinon, l'assembleur peut simplement enregistrer toutes les expressions jusqu'à ce qu'il rencontre à la fin de l'entrée; à ce stade, tous les symboles doivent être définis et il devrait donc être en mesure de déterminer les valeurs finales de chaque expression. On choisit entre ces deux techniques basées sur la quantité de mémoire peut se permettre de stocker de l'avant référence expressions.
Dans un siècle précédent, j'ai construit un passe-assembleur qui a couru sur un 8k octets de l'ordinateur, qui a utilisé le polonais représentation des expressions. En tant que symboles ont été définis, le polonais expression a été évaluée et toutes les sous-expressions qui ont été calculable ont été calculées, la simplification de l'résultant polonais, soit à une valeur finale ou d'une petite polonaise expression impliquant seulement les opérateurs sur les symboles non définis. Symbole des entrées de la table des valeurs non définies avait une liste de tous les polonais expression emplacements correspondant à des symboles non définis; en tant que symbole de définitions ont été rencontrés, tous les éléments de la liste liée ont été mises à jour et polonais expressions ont été ré-évalués, comme cela s'est produit. Cela permet de maintenir le polonais expression des tailles aussi petites que possible et de se débarrasser d'eux au moment où l'ensemble de leurs symboles sont définis. Cette assembleur traitées centaines de milliers de programmes en ligne de l'amende juste dans la petite machine. La raison pour faire passer un assembleur dans une si petite machine est le code source est venu à partir de la bande de papier (un Télétype, pour ceux qui sont assez vieux pour se souvenir) et de la lecture de cette bande de papier est encore une fois assez douloureuse et lente; une deuxième fois, c'était pas une bonne idée, donc deux passes de l'assembleur n'a pas été un choix approprié.
Un de mes cohortes beaucoup plus tard construit une intéressante en deux passes assembleur. Plutôt que de traiter de la texte deux fois, il est sous le texte (stockage en mémoire) sur la première passe, ainsi que la collecte des valeurs de symbole. Passer deux traités le sous texte.
Cela a été très rapide en assembleur pour deux passes. Il avait beaucoup plus de mémoire disponible.
Avenir Symbole Probleam Signifie Le Symbole Est À Utiliser Avant De Les Définir.
C'Est Possible Parce qu'En Langage d'Assemblage Programme, le Programmeur Peut Définir Symbole Anywere Donc, Si le Symbole Est Avant de la Définir, Il est Appelé "référence vers l'avant"
À Un Moment De la Conversion En Machine(Binaire) de la Langue ,de l'Assembleur obtenir Opcode-Reg-X2-B2 Mais Il Diden pas Obtenir D2(Déplacement) entrée dans la Table des symboles, de Sorte qu'Il n'Est Pas Possible De Convertir En Langage Machine(Binaire), Et Il est Appelé "Référence directe Problème".
À La Résolution De Ce 2 Pass Assembleur Est De Définir.
**Lors De La Première Passe(Première Analyse) - Il Des Entrées De Symboles(Étiquettes) Dans La Table Des Symboles.
**Et Au Deuxième Passage(Deuxième Analyse En Temps) Assembleur De Le Convertir En Langage Machine(Binaire). C'est Très Simple 🙂