yasep/docs/assembly_fr.html version 2009-09-02
Retour à la page d'accueil
version anglaise :

Le langage assembleur du YASEP

Introduction

Cette page décrit l'assembleur du YASEP (c'est à dire le programme qui transforme les instructions en code binaire) ainsi que les conventions de langage (la syntaxe) permettant d'écrire un logiciel pour le YASEP. Pour obtenir des informations sur une instruction en particulier, consultez la carte des opcodes et les pages du manuel du jeu d'instruction.

Cette page couvre les points suivants :

Organisation

L'assembleur du YASEP est constitué de deux couches :

  • L'encodeur d'instructions (ou assembleur primitif) est une routine JavaScript qui assemble une instruction à la fois. 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.

  • L'assembleur "haut niveau" découpe un programme entier en lignes indépendantes pour les envoyer à l'encodeur d'instructions. Il ne s'occupe pas directement des opcodes mais doit gérer les tables de symboles, effectuer des substitutions et des évaluations de valeurs, organiser les résultats sous forme exportable... A priori, cela sera effectué par listed.
  • L'encodeur d'instructions

    Les instructions du YASEP sont simples mais elles ne sont pas toujours pratiques, alors certains opcodes ont besoin de modifications mineures. Ce sont souvent des dérogations mineures aux règles de codage, qui sont indiquées par des flags (des propriétés de chaque opcode).

    L'assembleur tient compte de ces flags pour transformer le texte en code binaire, afin de garder les instructions utilisables, lisibles et cohérentes, indépendamment de leur encodage réel, des exceptions d'encodage ou de l'architecture du processeur.

    Le but du langage assembleur est d'éviter au developpeur de logiciels de penser aux details de l'architecture. Pour coder en langage avec le YASEP, il suffit de garder à l'esprit un minimum de règles :

    Avec ces quelques règles, il est possible de comprendre la sémantique de toutes les instructions, même si on ne connaît pas les exceptions ou variations spécifiques à chaque opcode.

    Assemblage d'une instruction

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

    Le format des nombres

    L'assembleur accepte 3 formats de nombres :

    Les nombres sont souvent utilisés dans des contextes où le nombre de bits significatifs est limité par la taille du conteneur (habituellement, le champ immédiat). Quand tropo de bits sont écrits, l'assembleur conserve seulement le nombre desiré de bits de poid faible, et efface les bits de poids forts. L'exemple suivant montre comment le nombre est tronqué : db 1234h.

    Note : le désassembleur écrit toujours les valeurs en hexadécimal.

    Pseudo-instructions

    La capacité à créee des nombres arbitraires est souvent indispensable. L'assembleur dispose des trois pseudo-instructions suivantes :

    Un nombre ilimité de nombre litéraux est accepté (depuis le 4/04/2007 et la limite dépend du moteur JavaScript, pas du codage de l'assembleur). La fenêtre flottante de l'assembleur n'affichera pas tout les chiffres quand plus de 32 bits seront donnés mais ils seront disponibles dans d'autres logiciels, en definissant la fonction emit_bin() :

    Exemple : db 12h 34h 56h 78h 9Ah BCh DEFh
    Le résultat est envoyé à emit_bin() :

    Il n'est pas encore possible d'écrire des chaînes ASCII à l'heure actuelle.

    Core datapath width

    Since 2008-08, YASEP exists in 16-bit and 32-bit variants. The opcodes don't change but a few of them are pointless in 16-bit mode or 32-bit mode. The source code can specify that a certain width is used so a warning is issued when a pointless instruction (probably invalid for the given CPU) is assembled.

    YASEP16 specifies that the targetted CPU has a 16-bit datapath. All 32-bit only instructions generate a warning.

    YASEP32 specifies that the targetted CPU has a 32-bit datapath. All 16-bit only instructions generate a warning.

    YASEP resets the target CPU to generic/undefined.

    These pseudo-instructions don't generate any code and can be used in any order, as they simply control an internal flag. This flag is compared with each instruction's flag (see YASEP32_ONLY and YASEP16_ONLY below).

    Reserved symbols

    The instruction-level assembler recognizes the following symbols, and rejects anything else :

    Aliases

    There are two types of aliases : form aliases (see ALIAS_RR) and instruction aliases (they are listed under the opcode map). This section is about instruction aliases.

    Internally, they can be used like normal instructions, but they provide different forms and/or different semantics. However, they use real opcodes of other instructions. The substitution is handled at the assembly level and the disassembly probably won't infer the originally assembled alias. So don't be surprised if instructions like NOT or NEG assemble correctly, but the disassembly returns a different opcode.

    Instruction Forms and flags

    Despite the very simple instruction format, the assembly language instructions appear with several different forms. This is due usually to reasons like :

  • The instruction does not make sense with one form, for example HALT does not need an immediate field.
  • The assembly language must be easy to read and understand, hence some fields are written in a different order internally.
  • The various instructions forms are described in the instructions_fr.html page.

    The flags have their own page too.

    Default values

    Normally, all uninitialized data, fields or values are cleared (zero).

    However, when certain instruction fields are not used (by FORM_ALONE or FORM_R...), these fields could be set to values chosen by the assembler, for the purpose of power reduction.

    Toggle minimization and toggle spacing could help reduce the power consumption and EMI emissions. The YASEP assembler will be able to compute proper values rather easily. Padding Imm16s and NOPs can be enhanced this way, too. The possible reduction is quite low, but maybe could reach 5% when fetching instructions from external SDRAM ? Gotta try with and without, and even when EMI/toggles are maximized, just for testing it.