yasep/docs/assembly.html version 2009-07-09
Retour à la page d'acceuil

Le langage assembleur de YASEP

Introduction

Cette page décrit l'assembleur de YASEP et les conventions de langage utilisées pour écrire un logiciel pour YASEP. Pour obtenir des informations sur une instruction en particulier, consultez la carte des opcodes et les pages du manuel sur le jeu d'instruction.

Cette page couvre les points suivants :

L'architecture

L'assembleur de YASEP est divisé en deux couches :

  • L'encodeur d'instructions ou assembleur primitif est une routine JavaScript qui assemble une seule instruction. Elle peut être accédée via l'interface asm.html ou grâce à une fenêtre flottante (Quand on clique sur les instructions dans les fichiers HTML, comme add d2, r3). Ce n'est pas très sophistiqué mais très utile dans beaucoup de cas.

  • L'assembleur haut niveau prend un fichier entier, le découpe en lignes et les envoie à la routine précéden Il ne s'occupe pas directement des instructions mais assemble les resultats, gere la table des symboles, evalue/calcule les valeurs, cree les binaires, manipule le preprocessing... Il sera decrit et developpe plus tard.

    Ou peut etre que l'assembleur haut niveau va simplement etre implemente comme une fonction de listed.

    L'encodeur d'instructions :

    Les instructions de YASEP sont vraiment tres simples mais elles ne sont pas encore tout a fait pratiques, alors certains opcodes vont demander des modifications mineures (voir ici). Elles ne sont generalement pas critiques et n'ont pas d'impact sur l'architecture, mais elles rendront les instructions plus utilisables en aidant le flux d'instructions a etre plus efficace.

    Le but du langage assembleur est de permettre au developpeur de logiciels de ne pas penser aux details de l'architecture. Ainsi ce precise la premiere regle : Le registre de destination est le dernier de la ligne.

    Input processing

    et c'est tout ce qu'il y a a dire au sujet de la "syntaxe d'entree".

    Le formatage des nombres

    Les nombres sont toujours sorti en hexadecimal et sont acceptes dans trois formats :

    Les nombres sont souvent utilises dans les contextes ou le nombre de bits significatifs est limite par la taille du conteneur (habituellement, le champ immediat optionnel). Quand les bits sont en entree, l'assembleur conserve seulement le nombre desire de bit de poid faible, et efface les bits de poids forts. L'exemple suivant montre comment le nombre est tronque : db 1234h.

    Les Pseudo-instructions

    La capacite a cree des nombres arbitraires est critique pour de nombreux usages alors l'assembleur possede les trois pseudo-instructions suivantes :

    Un nombre ilimite de nombre literaux est accepte (depuis le 4/04/2007 et la limite depend du moteur JavaScript, pas du design de l'assembleur). La fenetre flottante de l'assembleur n'affichera pas tout les chiffres quand plus de 32 bits seront donnes mais ils seront disponibles dans le logiciel (en definissant la fonction emit_bin() ).

    Exemple : db 12h 34h 56h 78h 9Ah BCh DEFh
    la sortie de emit_bin() :

    La capacite d'inclure les chaine ASCII est abandonnee a cette etape de l'ecriture.

    La largeur du chemin de donnee du coeur

    Depuis aout 2008, YASEP existe en version 16 et 32-bits. Les opcodes ne changent pas mais quelques uns inutiles en mode 16 ou 32-bits. Le code source peut specifie qu'une de ces largeur est utilisee et un warning est emi quand une instruction inutile (probabement invalide pour le CPU donne) est is assemble.

    YASEP16 specifie que le CPU cible a un champ de 16 bits. Toutes les instructions en 16 bits seulement genere un warning.

    YASEP32 specifie que le CPU cible a un champ de 32 bits. Toutes les instructions en 16 bits seulement genere un warning.

    YASEP indique que le CPU cible est indefini.

    Les pseudo-instructions ne generent aucun code et peuvent etre utilisee dans n'importe quel ordre, puisque qu'elle controle simplement un drapeau interne. Ce drapeau est compare avec chaque drapeau d'instruction (voir YASEP32_ONLY et YASEP16_ONLY en dessous).

    Symboles reserves

    L'encodeur d'instructions reconnait les symboles suivants et rejette tout le reste :

    Les Alias

    Il y a deux types d'alias : les alias de forme (voir ALIAS_RR) et les alias d'instruction (ils sont denombres sous la carte des opcodes). Cette section parle des alias d'instructions.

    En interne, ils peuvent etre utilises comme des instructions normales mais ils permettent differentes formes et/ou differentes semantiques. Cependant, ils utilisent des opcodes reels d'autres instructions. La substitution est effectuee au niveau de l'assembleur et le desassembleur ne pourra probablement pas deviner que etait l'alias original. Ne soyez pas surpris si les instructions comme NOT ou NEG s'assemble correctement mais que le desassembleur retourne un opcode different.

    Les formes d'instruction et les drapeaux

    En depit du format tres simple des instructions, les instructions en langage assembleur ont de nombreuses formes differentes. Cela est du pour quelques raisons  :

  • L'instruction ne peut pas etre sous une seule forme, par exemple HALT ne necessite pas de champ immediat.
  • Le langage assembleur doit etre facile a ecrire et comprendre, par consequent beaucoup de champssont ecrits dans un ordre different en interne.
  • Les formes d'instruction variees sont decrites dans la page instructions.html.

    Les drapeaux ont egalement leur propre page.

    Valeurs par defaut

    En temps normal, toutes les donnees, champs ou valeurs non initialisees sont mise a zero.

    Cependant, quand certains champs d'instructions ne sont pas utilises (par FORM_ALONE ou FORM_R...), Ces champs doivent etre initialises avec les valeurs choisies par l'assembleur, pour reduire la consommation de courant.

    Toggle minimization and toggle spacing pourrait aider a reduire la consommation de courant and les emissions EMI. L'assembleur de YASEP sera capable de calculer les bonnes valeurs assez facilement. Le remplissage de Imm16s et de NOPs peut etre ameliore de cette facon. La possible redution est plutot faible, mais pourrait peut etre atteindre 5% quand on charge les instructions depuis une SDRAM externe ? Essayez avec et sans, meme avec les EMI et les toggles a fond, pour voir.