12Fermer14
deleted2Le 05/11/2010 à 10:06
Oui, quand on assemble par fichier c'est ce qui se passe. Immaginons :
1.asm :

A:

2.asm :

        bsr.s B
        bsr   A
B:

A l'assemblage (deuxième passe je pense), A68k va fixer le 'bsr.s B' à sa taille et à son offset définitf, et à priori ne garder aucune trace de cette instruction (le saut étant entièrement résolu).
Mais évidemment, il va devoir émettre qqchose dans l'objet pour que le linker calcule le 'bsr A'. Et donc il doit, faute d'informations suffisantes, prévoir un 'bsr.w A', le 'bsr.s B' ne pouvant plus être modifié.

Il y a deux moyens d'optimiser ce genre de sauts d'après moi :

1. Dire à l'assembleur de ne pas chercher à calculer les références pc-relatives dans un même source, laissant ce boulot au linker (sauf si le codeur a imposé les longueurs, alors ces offsets doivent être marqués non-optimisables).
Le linker peut utiliser alors une méthode de "décompression" du code : il commence par dire que partout, les saut sonts courts. Ensuite, il vérifie chaque saut, en étendant à deux octets ceux qui au final ne tiennent pas sur un seul octet. Une fois qu'il a fait une passe où rien n'a changé, il peut considérer qu'il a complètement optimisé les branchements.

2. Dire à l'assembleur de garder une trace des sauts résolus (longueur imposée ou non, offset) dans l'objet, afin que le linker puisse adapter les offsets déjà calculés par l'assembleur.
Puis la même méthode de linking.


Ce n'est qu'une différence de main d'oeuvre au final. D'un côté on fait bosser l'assembleur, de l'autre côté le linker.
J'imagine qu'un codeur puriste de l'assembleur voudrait que son assembleur lui calcule ses sauts, il sait quand même ce qu'il a écrit, c'était pas au hasard, et son assembleur chéri sait le faire dans la seconde passe. Tandis qu'un accro du linker préférera qu son linker favori s'occupe de tout ce qui est offset sans que l'assembleur vienne mettre les doigts dedans.

En fait, je ne sais pas ce qui est le mieux, mais les deux méthodes donnent le même résultat grin