IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Adresses relatives -> adresses absolues


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Par défaut Adresses relatives -> adresses absolues
    Bonjour,

    Je manipule actuellement des fichiers de bytecode au sein desquels les décalages sont relatifs. Pour faciliter la manipulation des données je cherche à transformer toutes ces adresses en adresses absolues de façon à accéder facilement à la cible d'un saut.

    Exemple :

    POP
    POP
    JMP 7
    PUSH 2
    PUSH 4
    PUSH 6
    PRINT

    POP a une taille de 1 tandis qu'une instruction possédant un argument a une taille 2. Ici le décalage du JMP saute tous les PUSH et nous fait exécuter le PRINT.
    L'algorithme transforme cette liste de bytecode en liste d'instructions de plus haut niveau de sorte à considérer POP comme l'instruction 0, le deuxième POP -> 2, JMP 7 -> 3 etc.

    Ainsi la cible du JMP ne serait plus 7 mais 6 (le nombre d'instructions depuis la première).

    Pour réaliser ceci j'ai pour le moment l'algorithme suivant :

    Si je détecte une instruction de saut je l'ajoute dans une liste dans laquelle je maintiens des décalages relatifs. J'illustre le principe avec l'exemple d'au-dessus. J'arrive sur le JMP je sais que c'est une instruction de saut donc je l'ajoute à la liste. Pour cela si la liste contenait déjà un saut d'un certain décalage, si le décalage de la tête de liste était supérieur à 7, je soustrais 7 à ce décalage et je l'insère plus loin dans la liste en répétant l'opération de test. Dans le cas contraire, on l'ajoute en tête en modifiant l'ancienne de liste.

    Un petit schéma avec la liste d'instructions ; JMP 6; JMP 3; JMP 9

    1) 6 (JMP 6)
    2) 3 (JMP 3), 3 (JMP 6)
    3) 3 (JMP 3), 3 (JMP 6), 3 (JMP 9)

    Cela permet de ne modifier que la tête de liste à chaque instruction pour décrémenter l'offset en accordant une linéarité à l'ajout.

    Je voulais savoir s'il n'y avait pas une autre méthode permettant par exemple d'enlever la linéarité de l'ajout en utilisant un autre table de la taille du code ou autre. Parce que ça me semble un peu complexe pour une tâche assez simple.

    J'espère avoir été clair :-)

    Merci à vous.

    --
    sperca

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par sperca Voir le message
    Je voulais savoir s'il n'y avait pas une autre méthode permettant par exemple d'enlever la linéarité de l'ajout en utilisant un autre table de la taille du code ou autre. Parce que ça me semble un peu complexe pour une tâche assez simple.
    Ton problème c'est de transformer un saut relatif en saut absolu "adresse" puis en saut absolu "n° de ligne" ?


    # |  @ | code
    ------------------
    0 |  0 | POP
    1 |  1 | POP
    2 |  2 | JMP 7
    3 |  4 | PUSH 2
    4 |  6 | PUSH 4
    5 |  8 | PUSH 6
    6 | 10 | PRINT
    
    JMP 7 --> JMP @10 --> JMP #6
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Par défaut
    Re,

    C'est exactement ça. Et j'ai trouvé une autre solution beaucoup plus simple avec une complexité linéaire. Elle consiste à construire un tableau d'instruction en mémorisant l'octet du début de l'instruction pour chaque instruction et à utiliser un tableau de la taille du bytecode pour effectuer les indirections. Ce qui fait que pour le code suivant on obtient ceci

    JUMP 8 @ 0
    PUSH @ 3
    POP @ 4
    PRINT 5 @ 5
    BRANCH 7 @ 7
    POP
    POP

    Au fur et à mesure du parsing j'obtiens ces adresses. Puis dans un autre tableau, j'affecte chaque indice correspondant à une adresse d'instruction et ainsi je peux facilement convertir.

    Merci à vous !

    À la prochaine.

    --
    sperca

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Trouver une adresse relative à Target.adress
    Par Excel_man dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/11/2013, 22h09
  2. Adresse relative et chemin absolu
    Par queen_pitbull dans le forum Langage
    Réponses: 2
    Dernier message: 07/09/2010, 10h23
  3. adresse relative absolue
    Par Balbuzard dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 01/12/2008, 18h13
  4. Adresse relative et adresse absolue
    Par solorac dans le forum Excel
    Réponses: 2
    Dernier message: 03/10/2007, 12h08
  5. [CKEditor] Adresse relatives et absolues dans FCKeditor
    Par jul.oob dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 10/05/2007, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo