Question

Le semestre dernier à l'université, mon professeur dans la classe Langages nous a enseigné le langage ésotérique appelé Whitespace . Dans l'intérêt d'apprendre la langue mieux avec un horaire très chargé (mi-session), j'ai écrit un et href="http://code.activestate.com/recipes/577108-whitespace-assembler/" rel="nofollow noreferrer"> assembleur Python . a été conçu pour faciliter l'écriture de programmes facilement, et programme échantillon a été écrit avec l'ensemble donné mnémoniques .

Maintenant que c'est l'été, un nouveau projet a commencé avec l'objectif étant de réécrire l'interprète et assembleur pour 0,3 Whitespace, avec d'autres développements à venir par la suite. Comme il y a tellement de temps avant que de travailler sur sa conception, vous êtes présenté ici avec un plan qui fournit un ensemble révisé de mnémoniques pour le langage assembleur. Ce message est marqué comme un wiki pour leur discussion.

Avez-vous déjà eu une expérience avec les langages d'assemblage dans le passé? Y avait-il des instructions que vous avez pensé aurait dû être renommé quelque chose de différent? Est-ce que vous vous trouvez à penser en dehors des sentiers battus et avec un paradigme différent de celui dans lequel les mnémoniques ont été nommés? Si vous pouvez répondre oui à l'une de ces questions, vous êtes les bienvenus ici. réponses subjectives sont appréciés!


Manipulation Stack (IMP: [Espace])

manipulation Stack est l'une des opérations les plus courantes, d'où la brièveté de la PMI [Espace]. Il y a quatre instructions de pile.

hold N       Push the number onto the stack
copy         Duplicate the top item on the stack
copy N       Copy the nth item on the stack (given by the argument) onto the top of the stack
swap         Swap the top two items on the stack
drop         Discard the top item on the stack
drop N       Slide n items off the stack, keeping the top item

Arithmétique (IMP: [Tab] [Espace])

commandes arithmétiques fonctionnent sur les deux éléments supérieurs de la pile, et les remplacer par le résultat de l'opération. Le premier élément poussé est considéré comme à gauche de l'opérateur.

add          Addition
sub          Subtraction
mul          Multiplication
div          Integer Division
mod          Modulo

Heap Access (IMP: [Tab] [Tab])

Heap commandes d'accès regardent la pile pour trouver l'adresse d'éléments à être stockés ou récupérés. Pour enregistrer un élément, appuyez sur l'adresse la valeur et exécutez la commande magasin. Pour récupérer un élément, appuyez sur l'adresse et exécuter la commande retrieve, qui placera la valeur stockée dans l'emplacement en haut de la pile.

save         Store
load         Retrieve

Flow Control (IMP: [LF])

Les opérations de contrôle de flux sont également fréquents. Les sous-routines sont marquées par des étiquettes, ainsi que les cibles de sauts conditionnels et inconditionnels, par lequel les boucles peuvent être mises en œuvre. Les programmes doivent être terminés au moyen de [LF] [LF] [LF] pour que l'interprète peut sortir proprement.

L:           Mark a location in the program
call L       Call a subroutine
goto L       Jump unconditionally to a label
if=0 L       Jump to a label if the top of the stack is zero
if<0 L       Jump to a label if the top of the stack is negative
return       End a subroutine and transfer control back to the caller
halt         End the program

I / O (IMP: [Tab] [LF])

Enfin, nous devons être en mesure d'interagir avec l'utilisateur. Il y a des instructions IO pour lire et écrire des chiffres et des caractères individuels. Avec ces derniers, les routines de manipulation de chaîne peuvent être écrites. Les instructions de lecture de prendre l'adresse de segment de mémoire dans lequel stocker le résultat de la partie supérieure de la pile.

print chr    Output the character at the top of the stack
print int    Output the number at the top of the stack
input chr    Read a character and place it in the location given by the top of the stack
input int    Read a number and place it in the location given by the top of the stack

Question: Comment vous redessiner, récrire ou renommer les mnémoniques précédents et pour quelles raisons

Était-ce utile?

La solution

  • pousser #n, à préciser que n est immédiate.
  • "swap" est parfois "exc" ou "éch" Je pense.
  • "Enregistrer" est généralement "st" (magasin)
  • "charge" est généralement "ld"
  • "appel" pourrait aussi être "JSR" ou "bl".
  • "goto" est généralement "jmp" ou "soutien-gorge"
  • "si = 0" est généralement "beq"
  • "si <0" est généralement "BLT"
  • "retour" est généralement "ret" ou "BLR"
  • "exit" est généralement "arrêt" / "HLT" dans le contexte d'une unité centrale de traitement.
  • "impression chr" et "print int" pourrait être "print.c" et "print.i". Il y a plusieurs façons de spécifier des variantes instruction, mais le plus souvent il est pas dans les opérandes.

EDIT:

Si vous ne me dérange pas amalgamer opcodes et les modes d'adressage, en utilisant la syntaxe CISCy,

  • "push (sp)" au lieu de "copier"
  • "push N (sp)" au lieu de "copier N" (modulo multipliant par la taille de texte)
  • "push * (sp)" au lieu de "charge" (sauf qu'il fait un bruit avant de pousser les valeurs chargées)
  • "pop * 1 (sp)" au lieu de "push" (sauf qu'il apparaît en fait deux fois)

D'autre part, le code à base de pile généralement traite pousser et pop implicite. Dans ce cas, « imm n » (immédiate) au lieu de « pousser ». Ensuite, toutes les opérations de la pile sont des opérations purement pile, ce qui est agréable et cohérente.

Je ne sais pas comment j'écrire « déposer » - la description fait sonner comme « drop 1 » ne correspond pas à « goutte » qui semble étrange

.

Autres conseils

Je pense que le premier changement que je propose est pour changer de prise et tomber à pousser et pop respectivement.

Alors peut-être je renomme copie dup (je pense que c'est le nom le plus commun pour cette opération dans les langages orientés de la pile).

Je suis un peu perplexe pourquoi souvent vous avez une courte explications de mots qui sont différents à la mnémotechnique. Par exemple mnémotechnique est Save, explication est un magasin. Mnémonique est la charge, l'explication est Retrieve. Soit dit en passant ceux qui me sont les deux mnémoniques qui ne sont pas suffisamment expliqués. Enregistrer ce où? Chargez ce que d'où? ( Modifier la question a ensuite été modifiée pour rendre ces significations claires)

Merci pour le post intéressant.

Je comprends pas que je complètement votre question, donc si je suis hors de la base, pardonnez-moi.

En plus de votre pile, je ne serais probablement ajouter un « registre d'état » qui contient une variété de différents drapeaux (comme Carry, trop-plein et zéro) qui sont fixés par les opérateurs arithmétiques.

Je puis ajouter « si » les formes qui testent ces drapeaux.

J'ajouterait décalage de bits et rotate instructions (à gauche et à droite), ainsi que ET / OU / XOR / NON opérations qui fonctionnent sur les bits.

Vous souhaiterez probablement avoir une sorte d'accès à la mémoire, à moins que vous avez l'intention des instructions d'E / S à mémoire traiter comme un flux de valeurs pour ce bon vieux façonné sensation machine de Turing.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top