L'adressage relative étant utilisé dans les fonctions pour les sauts (if, while, etc...) mais pas entre fonction. Une fonction peut-être appelé n'importe où. Il faut aussi pensé aux pointeurs de fonction qui peut-être utilisé.
Tu as sans doute raison pour les pointeurs de fonction, mais tu te trompes pour l'adressage relatif qui ne serait pas utilisable entre fonctions.
Dans le cas des pointeurs de fonctions, en effet je ne vois pas trop comment on ferait sans stocker le pointeur complet. Un offset relatif ne marcherait pas pour la ligne "func = titi() ;" puisque cet offset devrait être modifié entre le moment de l'affectation et la ligne où on y fait référence ( "func();" ).
Quoique finalement ça ne devrait pas être très difficile de faire un compilateur qui serait capable de suivre les offset des pointeurs de fonction...
Par contre, n'importe quel appel de fonction "normal" marche très bien avec des offset relatifs, c'est ce qu'il se passe quand tu génères du code "PIC" (position independant code"). Sur 68000 ça se code avec un "jsr offset(PC)" si ma mémoire est bonne. Un appel de fonction ou un saut de boucle, ce n'est jamais qu'un saut (avec dans le cas d'une fonction une sauvegarde sur pile de l'adresse de départ, et un "ret" au bout).
[^] # Re: Position d'Intel sur les processeurs 64 bits grand public
Posté par Olivier Jeannet . En réponse à la dépêche Position d'Intel sur les processeurs 64 bits grand public. Évalué à 1.
Tu as sans doute raison pour les pointeurs de fonction, mais tu te trompes pour l'adressage relatif qui ne serait pas utilisable entre fonctions.
Dans le cas des pointeurs de fonctions, en effet je ne vois pas trop comment on ferait sans stocker le pointeur complet. Un offset relatif ne marcherait pas pour la ligne "func = titi() ;" puisque cet offset devrait être modifié entre le moment de l'affectation et la ligne où on y fait référence ( "func();" ).
Quoique finalement ça ne devrait pas être très difficile de faire un compilateur qui serait capable de suivre les offset des pointeurs de fonction...
Par contre, n'importe quel appel de fonction "normal" marche très bien avec des offset relatifs, c'est ce qu'il se passe quand tu génères du code "PIC" (position independant code"). Sur 68000 ça se code avec un "jsr offset(PC)" si ma mémoire est bonne. Un appel de fonction ou un saut de boucle, ce n'est jamais qu'un saut (avec dans le cas d'une fonction une sauvegarde sur pile de l'adresse de départ, et un "ret" au bout).