Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Assembleur PIC : faire un goto "variable"



  1. #1
    Toufinet

    Assembleur PIC : faire un goto "variable"

    Bonjour à tous,

    Voilà, dans le but d'optimiser mon programme assembleur, j'aimerais savoir s'il est possible de faire un GOTO variable.

    Je m'explique :
    Au lieu de faire ( je schématise ) :
    Code:
    "si W = 0, alors GOTO label0
    si W = 1, alors GOTO label1
    si W = 2, alors GOTO label2
    "
    J'essaie de faire :
    Code:
    "tant que W != variable, on incrémente variable.
    Ensuite, GOTO adresse + X fois variable"
    Mon problème est qu'il faudrait que j'arrive à récupérer la valeur de l'adresse "adresse", puis la manipuler pour y ajouter X fois "variable", et seulement ENSUITE faire le GOTO ..

    Ca peut paraître très compliqué, mais ça transforme 1000 lignes de code en une 10aine ( en gros ... ) !

    Bref, j'arrive pas à trouver le moyen de faire ça ( en assembleur bien sûr ) , quelqu'un aurait-il une piste ?

    Merci

    -----


  2. Publicité
  3. #2
    Seb.26

    Re : Assembleur PIC : faire un goto "variable"

    Regarde le code généré par un compilo pour un switch ... c'est probablement ce que tu cherche ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  4. #3
    Toufinet

    Re : Assembleur PIC : faire un goto "variable"

    C'est à dire ?

    Un switch, c'est des if ... je vois pas le "goto variable" là

  5. #4
    Toufinet

    Re : Assembleur PIC : faire un goto "variable"

    ah, je crois qu'on peut faire :
    GOTO $+variable

    Je vous tient au courant

  6. #5
    Toufinet

    Re : Assembleur PIC : faire un goto "variable"

    Aarff nan , flut ...

    Quand on fait "GOTO $+variable" , il GOTO à l'adresse actuelle + l'adresse de la variable ( et non la valeur de la variable ... )
    Je sens que je suis pas loin pourtant !

  7. A voir en vidéo sur Futura
  8. #6
    lil-vince

    Re : Assembleur PIC : faire un goto "variable"

    Salut,
    ca fait longtemps que je n´ai pas fait d´ASM mais si je me rappel bien, il y a le signe @ qui signifie "adresse", t´as essayé GOTO @($+variable) ? (ou justement sans le @)

    ou variable += $ puis GOTO @variable

    (Je m´excuse si je dit des conneries parce que je n´en ais plus refait hors de mes études...)

  9. Publicité
  10. #7
    lolomatic

    Re : Assembleur PIC : faire un goto "variable"

    Bonjour

    La résolution de ton problème passe par ce qu'on appelle l'arithmétique des pointeurs.

    Derrière ce terme pompeux se cache simplement une technique pour manipuler les adresses, et pour ce faire, il suffit de voir ce que ton architecture te propose :
    (Tu n'as pas précisé PIC16 ou PIC18, je prends donc le plus simple)

    Compteur mémoire programme : PCL

    Si tu veux "sauter' à une adresse programme qui dépend d'une variable, il faut que tu écrives directement dans ton compteur de mémoire programme, qui est accessible en écriture (du moins, la partie basse, d'où le PCL).

    Au prochain cycle d'horloge, ton programme continueras à ton adresse programmée...

    Exemple :
    Tu es à l'adresse 0x100, et tu veux aller à l'adresse 0x150 d'un coup, tu fais :
    movlw 0x50
    addwf PCL ; ajout de 0x50 à l'adresse actuelle


    Evidemment, tu ne vas pas devoir connaitre toutes les adresses de tes "labels", pour obtenir l'adresse du saut, pour cela, MPLAB te donne la possibilité de récupérer que l'octet de poids faible d'une adresse en faisant :

    movlw LOW label1 ; charge l'octet de poids faible dans W
    movwf PCL


    Voilà, bonne continuation
    Dernière modification par lolomatic ; 04/03/2008 à 12h22.

  11. #8
    Toufinet

    Re : Assembleur PIC : faire un goto "variable"

    Oui, j'ai eu la réponse sur le forum de microchip ..
    Il faut en effet utiliser PCL

    Problème résolu, merci

  12. #9
    Seb.26

    Re : Assembleur PIC : faire un goto "variable"

    Citation Envoyé par Toufinet Voir le message
    C'est à dire ?
    Un switch, c'est des if ... je vois pas le "goto variable" là
    Certains compilo peuvent optimiser les switch en tables d'indirection, c'est particulièrement efficace quand les valeurs des "case" sont proches, genre 0 à 10 ... Dans ce cas, le CPU se contente de charger l'adr de destination depuis la table d'indirection, et fait un saut variable.

    Car ton problème avec ton saut à X*"valeur du case" va être que tes sous-fonctions de destination doivent être de taille identique pour être sûr que le saut ira bien au bon endroit ... je trouve ça limitatif ... sauf si tu prevois que tes sous-fonctions soient en fait des JUMP ... ce qui rejoins le principe de la table d'indirection ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #10
    Toufinet

    Re : Assembleur PIC : faire un goto "variable"

    nan pour mon application ( et j'ai fait en sorte que .. ), les sauts sont toujours de même valeur relative, donc le X fois "valeur" convient parfaitement.

    Mais comme le programme est assez long, là je retombe sur des problèmes de PCLATH, que je ne pourrais gérer qu'une fois le programme terminé ...

    Du coup je vais peut-être tenter la solution de faire comme un switch comme tu l'as décris précédemment

Sur le même thème :

Discussions similaires

  1. aide pour alimentation variable "simple"
    Par stan2410 dans le forum Électronique
    Réponses: 5
    Dernier message: 21/02/2008, 18h11
  2. melange "Assembleur et C"
    Par Cyrius666 dans le forum Électronique
    Réponses: 2
    Dernier message: 31/05/2006, 11h24