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
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
Partager