Fermer2
FarewellLe 27/04/2009 à 18:56
Yop,

Je suis, pour un autre problème, confronté à un problème de structurations de mes données. En assembleur, j'écrivais ceci :
DataSection	MainMenu
		.even
		.word	2

		.word	ExecCfgFlagsMenu-PC_Table
		.word	ExecCfgEVMenu-PC_Table
		.word	Quit-PC_Table

		.asciz	"Configure flags"
		.asciz	"Configure environment variables"

			.asciz	"Flags : AutoArc, OffSwitch,"
			.asciz	"GetKeySwitch, StatusError"
		.byte 0
			.asciz	"Variables : apd, start, home, temp,"
			.asciz	"args, fkey[n]"
		.byte 0

Ca représente en fait une structure :
- 2 + 1 offsets dans une table de saut
- 2 chaines "principales"
- 2 chaines commentaires

Le truc commode, c'est qu'un menu se suffisait à lui-même pour dire ce qu'il devait advenir, suivant qu'on sélectionnait une option ou l'autre (deux premiers offset), ou qu'on appuyait sur ESC (dernier offset dans la table de saut, pc-relative évidemment). Ca permet une profondeur infinie de menu sans écrire une ligne de code. Suffit de rajouter du texte et des labels.

Comment faire un truc similaire en C ?
Pour les chaines, pas de souci, je fais une structure de tableaux, ça devrait le faire. Par contre, pour rajouter à chaque élément de ma structure ce qui doit être exécuté, comment faire ?
j'imagine que si j'écris le nom de la fonction, ou un pointeur vers la fonction, je vais y arriver. Mais au fait, comment exécuter du code à un endroit dont on connait l'adresse ? Sans passer par asm() évidemment grin Et comment y passer de manière non-récursive, de manière à ne pas empiler les adresses de retour sur la pile ? ie comment faire un jmp vers un jmp vers une fonction quand on connait son adresse, st non un jsr ?
Le top : comment faire pour avoir une table de relogement pc-relative pour sauter à la fonction qu'on veut ? Avec encore en plus le côté plus "bra" que "bsr" ?

Autre question, et peut-être la seule la vraie : Comment voir les choses avec un oeil Ciste et non assembleuriste ? grin