2009-07-30 8 views
4

J'ai une fonction C qui contient tout le code qui implémentera les bytecodes d'un interprète bytecode. Je me demande s'il existe un moyen d'aligner des segments du code compilé en mémoire sur des limites de taille fixe afin que je puisse calculer directement l'adresse à partir de la valeur du bytecode? Un peu comme un tableau fonctionne mais au lieu de lire à partir de l'adresse calculée, je suis en train de sauter dessus. Je suis conscient que je devrai mettre le code pour effectuer le saut suivant à la fin de chaque segment de code "bytecode" et que je devrai faire la taille de la limite au moins aussi grande que la taille du plus grand segment.Aligner le code natif sur les limites de la mémoire de taille fixe avec GCC/G ++/AS?

Si c'est même possible, comment dirais-je au compilateur/assembleur (gcc/g ++/as) d'aligner de cette façon?

Répondre

7

Je réalise que ce n'est pas exactement ce que vous demandez, mais c'est la façon standard d'implémenter des interpréteurs de code octet avec GCC.

La fonction "goto" ou "étiquettes en tant que valeurs" de GCC vous permet de placer des étiquettes dans un tableau et de passer efficacement à différentes instructions de code-bytecode. Voir Fast interpreter using gcc's computed goto. Regardez également cette question Stack Overflow: C/C++ goto et GCC documentation on labels as values.

Le code pour ce faire ressemblerait à quelque chose comme ceci:

void* jumptable[] = {&&label1, &&label2}; 

label: 
    /* Code here... */ 

label2: 
    /* Other code here... */ 

Vous pouvez ensuite passer à des instructions en utilisant la table:

goto *jumptable[i]; 
0

Il y a deux questions ici, mais la réponse est le même. D'abord, vous écrivez des données (binaires) dans un fichier (binaire). Deuxièmement, vous chargez ces données (binaires) en mémoire. Vous contrôlez où il va sur le disque, et vous contrôlez où il va en mémoire. Vous pouvez facilement calculer ce que vous cherchez.

Personnellement, j'utiliserais probablement un tableau lors du chargement des données en mémoire, et je ferais en sorte que toutes les données commencent à un index valide dans ce tableau. Les tableaux sont disposés de manière contiguë et sont relativement faciles à utiliser. Le livre de Kernighan et Ritchie Le langage de programmation C mentionne une technique d'utilisation de union s pour l'alignement, mais cela ne facilite pas l'arithmétique du pointeur.

0

Si vous utilisez linux, utilisez posix_memalign(). Je suis sûr qu'il existe une fonction similaire pour Windows.

Si vous souhaitez aligner votre propre code, jetez un oeil à la syntaxe gcc __attribute__.

Les options de texte ld peuvent également être utiles.