2009-09-19 8 views
0

J'écris mon propre bytecode et ma machine virtuelle (sur .NET) et une chose que je n'arrive pas à comprendre est de savoir comment intégrer des chaînes dans mon bytecode. Des idées maintenant comment je devrais le faire?Comment les chaînes sont-elles intégrées dans les fichiers binaires?

+0

C'est ce qu'on appelle le bytecode en Java. Dans .NET, c'est CIL, j'ai donc mis à jour vos tags. Avez-vous consulté une référence CIL? –

+0

non, j'écris sur la plate-forme .net un programme qui interprète un tableau d'octets comme ma propre saveur personnalisée de bytecode. – RCIX

+0

Ce que je n'arrive pas à comprendre, c'est comment intégrer autre chose que des nombres dans ce tableau. – RCIX

Répondre

1

Apparemment, vous définissez votre propre code d'octet. cela n'a rien à voir avec la syntaxe/grammaire de .NET CIL, non? Si oui, et si vous voulez savoir comment encoder des chaînes (par opposition à d'autres instructions telles que des sauts, des boucles, etc.), vous pouvez simplement inventer votre propre "instruction" pour cela.

Par exemple, le code hexadécimal "01xx" peut être une chaîne contenant xx octets (0 -255). Votre interprète de langage serait alors enseigné pour stocker cette chaîne sur la pile (ou ailleurs) et se déplacer pour décoder le code octet suivant situé xx octets plus bas dans le flux de bytecode.

Si vous le souci est comment mélanger des données de caractères et des données numériques quel que soit le stockage que vous avez pour le bytecode, s'il vous plaît fournir des détails et peut-être quelqu'un peut aider ...

+0

Correct, je fais le mien. Je reçois un peu ce que vous dites, mais l'instruction Ieach dans mon bytecode se compose de 4 octets distincts (1 pour l'opcode et 3 autres, dont le but varie avec l'instruction), et je voudrais éviter d'avoir une longueur variable instructions. Il pourrait être réalisé en toute sécurité en codant la longueur des données dans l'instruction elle-même mais cela le rendrait beaucoup plus complexe ... – RCIX

+1

Je vois les avantages d'avoir le bytecode avec une longueur et un format fixes. Dans ce cas, les chaînes peuvent simplement être implémentées en tant qu'instruction de déclaration de variable (que vous avez facilement conçue) par laquelle l'index (adresse, décalage, indice ...) où la chaîne réelle est stockée. La différence avec une variable régulière est que le stockage où la chaîne réside est initialisé avec la valeur de chaîne. En effet, avec des instructions de 3 octets, vous pouvez vous trouver limité pour d'autres types que les chaînes (par exemple, comment encoder une valeur numérique supérieure à 8 millions?) – mjv

+0

C'est une autre chose que je suis un peu perplexe aussi ... – RCIX

0

Si vous pouvez enregistrer des numéros dans un tableau, puis vous pouvez stocker des données ASCII dans le même tableau. En ignorant l'idée d'une chaîne en tant que classe, une chaîne simple est juste un tableau de caractères de toute façon - et en C, un octet avec une valeur de 0 indique la fin de la chaîne.

comme une simple preuve de concept en C:

int main() 
{ 
    putchar(104); // h 
    putchar(101); // e 
    putchar(108); // l 
    putchar(108); // l 
    putchar(111); // o 
    putchar(10); // \n 
    return 0; 
} 

Sortie:

 
$ ./a.out 
hello 

Peut-être un reference on character arrays as strings aiderait?

+0

Ce n'est pas aussi simple que ça: j'essaie d'intégrer des chaînes avec d'autres octets (qui sont des instructions dans mon propre format personnalisé) et je ne sais pas trop comment faire. – RCIX

Questions connexes