Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation Assembleur 68K » Code de démarrage en _nostub (13 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Folco Ecrit le: Mardi 6 décembre 2005 à 12:08 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Quand j'utilise ces exportations dans un programme asm _nostub:
_tigcc_native:      xdef  _tigcc_native
__ref_all___startup_code:  xdef  __ref_all___startup_code
__ref_all___nostub:    xdef  __ref_all___nostub

j'ai le message suivant à la compilation:
Absolute relocs: 1
Natively emitted relocs: 1
Relocs savable by branch optimisation: 6
Relocs savable by F-Line jumps: 6
Space savable by Using GNU Assembler -l switch: 12 bytes


alors que quand j'exporte juste le symbole _nostub, je n'ai aucun relogement, donc je ne perds pas de place.

Je ne veux pas utiliser le switch -l de GNU as (ben oui... j'aime bien savoir que c'est ce que j'ai écrit qui est assemblé, pas un truc dénaturé...). Donc j'aurais aimé savoir quel est le code de démarrage inclus ici par TIGCC pour pouvoir l'inclure de manière plus "propre" (ie: sans avoir de relogement).

Je devrais pouvoir trouver ça dans les sources du linker à mon avis??? mais au boulot c'est dur :D
Si quelqu'un avait ça directmeent sous la main, je lui en serait bien reconnaissant!
Merci beaucoup à celui qui prendra deux minutes pour me répondre.
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°1   Marquer comme non lu.
Kevin Kofler Ecrit le: Mardi 6 décembre 2005 à 15:19 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Il faut activer les optimisations du linker: --optimize-code --cut-ranges.
Le switch -l de GNU as ne peut pas éliminer ça, parce que le code de démarrage est déjà assemblé (dans tigcc.a). C'est le linker qui voit s'il y a des relogements qui peuvent être supprimés. En particulier, dans le cas le plus simple (code de démarrage qui ne fait rien), il voit qu'il y a un saut vers l'instruction d'après (si __main est tout au début de ton code) et le vire.
Quant aux sources dans lesquelles tu trouves ce qui est mis exactement, c'est dans les sources de TIGCCLIB (répertoire archive\startup). Mais l'idée est bien d'activer l'optimisation linker.

Martial Demolins :
Je ne veux pas utiliser le switch -l de GNU as (ben oui... j'aime bien savoir que c'est ce que j'ai écrit qui est assemblé, pas un truc dénaturé...).

Pas besoin d'être parano sur ce point, les optimisations du linker changent juste des références longues en des références plus courtes, ce n'est pas ça qui va changer tout ton code.
-Edité le Mardi 6 décembre 2005 à 15:21 par Kevin Kofler-
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°2   Marquer comme non lu.
Folco Ecrit le: Mardi 6 décembre 2005 à 15:53 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


ok, merci beaucoup Kevin pour les explications et l'emplacement du source.
oui, __main est bien au tout début de mon code.

Sinon, je sais que le linker ne fait que changer la longueur des sauts, mais je voudrais écrire le plus proprement possible, ie en réfléchissant à chaque chose que je vais faire, c'est pour ça. Je sais que tout n'est pas changé en bloc (sauf p-ê les clr.l-> moveq?? %))

merci beaucoup pour la précision de la réponse. :)
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°3   Marquer comme non lu.
Kevin Kofler Ecrit le: Mardi 6 décembre 2005 à 15:56 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Il faut dire que je ne comprends pas du tout cette attitude anti-optimisation. Voilà les optimisations effectuées par le linker:
  • x.l -> x(PC) si possible: Le plus courant. Ces optimisations ne changent pas du tout le sens du code, tout ce qui était une instruction avant en est toujours une après. Et l'assembleur fait aussi cette optimisation quand il peut (c'est-à-dire quand le label est dans le même fichier). L'optimisation n'est effectuée que quand aucune taille n'est précisée (donc qu'à priori tu t'en fous de la taille sur laquelle est codée ta référence), si tu précises .l, elle n'est pas effectuée. (Corollaire: ne préciser .l que quand il est vraiment indispensable que ce soit codé en absolu.)
  • jxx->bxx.w->bxx.s si possible: Optimisation de branchements. Ne change rien à la signification du code, et tout ce qui était une instruction avant en est toujours une après. Et l'assembleur fait aussi cette optimisation quand il peut (c'est-à-dire quand le label est dans le même fichier). Les sauts optimisables sont à noter jbxx label et bxx label. Les sauts non-optimisables (encore une fois: à n'utiliser que quand c'est absolument nécessaire, en général ça ne l'est pas!) sont à noter jmp/jsr label.l et les bxx.w label.
  • Suppression de bxx (sauf bsr) vers l'instruction juste après: Supprime une instruction, mais ne change autrement rien du tout au sens du code. Peut être évité en codant bxx.w label explicitement. (Un bxx.s vers la ligne d'après est interdit par le processeur de toute façon!)
  • Suppression des nops de padding à la fin des fichiers objet AmigaOS: Totalement sans effet avec GNU as!
  • Optimisation tailcall bsr+rts->bra, jsr+rts->jmp: La plus risquée des optimisations linker (mais sans effet nocif si on n'utilise pas des conventions d'appel très particulières et contraires à l'ABI de la plateforme), si ça te dérange, n'active pas --optimize-returns (mais mets toutes les autres optimisations, à savoir --optimize-nops --optimize-branches --optimize-moves --optimize-tests --optimize-calcs).


Les optimisations linker:
  • ne sont pas dangereuses. L'assembleur marque explicitement tout relogement optimisable ou non-optimisable, donc le linker n'optimise que ce qui peut être optimisé. Si on marque une taille explicite, ou si ce sont des pointeurs dans des données, l'optimisation n'est pas effectuée (donc aucun risque de faux positifs)!
  • sont utiles aussi pour l'assembleur, pas seulement pour le C: --optimize-nops est conçu spécifiquement pour A68k, et les optimisations de références concernent autant l'assembleur que le C! Tu ne peux pas savoir (en général) quand tu écris le code quelle sera la taille nécessaire pour la référence, et l'assembleur (en général) non plus. N'oublie pas que le cas général, ce sont des fichiers compilés séparément, et/ou des sections séparées. Le hack de tout coller dans le même fichier avec include n'est qu'un workaround pour les déficiences des anciens linkers et en aucun cas une solution raisonnable au problème. Ce hack empêche aussi au linker de réordonner ton code afin d'avoir des références plus compactes (les fichiers compilés séparément peuvent être placés dans n'importe quel ordre, et le linker essaie de trouver l'ordre qui minimise le nombre de relogements).


Exemple: dans le fichier foo.s, tu veux appeler la fonction toto qui se trouve dans bar.s. Comment fais-tu?
1. Sans optimisation linker, tu mets: jsr toto (ou jbsr toto, ça ne changera rien parce que l'assembleur ne peut pas savoir où se trouve toto vu que c'est une référence externe).
Résultat: relogement absolu, même si ce n'est pas nécessaire (ce qui est probable), donc gaspillage de place.
2. Sans optimisation linker, tu mets: bsr.w toto.
Résultat: branchement long systématique. Quand toto est plus loin que 32 KO, erreur. Quand c'est plus proche que 128 octets, gaspillage de 2 octets.
3. Sans optimisation linker, tu mets: bsr.s toto.
Résultat: ne marche très probablement pas (faudrait avoir de la chance que ça tombe dans les 128 octets autour, surtout sans permettre au linker de réordonner les sections!).
4. Tu mets jbsr toto et actives les optimisations linker.
Résultat: Le linker choisit automatiquement la référence la plus compacte possible (et essaiera même de réordonner tes fichiers pour pouvoir en choisir une plus compacte, cf. --reorder-sections). Aucune place gaspillée. => La solution à choisir!

Au passage, dans ma liste des switches linker à passer, j'ai oublié:
  • --reorder-sections: Le réordonnement des sections que j'ai décrit à plusieurs reprises plus haut.
  • --merge-constants: Constant merging. Ne concerne que les sections marquées explicitement comme "mergeable", donc tu peux l'ignorer a priori si tu fais du 100% ASM (ça ne fera rien si tu ne marques pas explicitement des sections comme "mergeable"), c'est très utile pour le C en revanche.
  • --remove-unused: Supprime les sections qui ne sont référencées nulle part. (Pourquoi mettre des fonctions dans l'exécutable que personne n'appelle?)
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°4   Marquer comme non lu.
Kevin Kofler Ecrit le: Mardi 6 décembre 2005 à 16:00 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Martial Demolins :
Sinon, je sais que le linker ne fait que changer la longueur des sauts, mais je voudrais écrire le plus proprement possible,

Le plus proprement possible, c'est utiliser les optimisations linker! Cf. aussi mon exemple dans le post n°3.

ie en réfléchissant à chaque chose que je vais faire,

Tu ne peux pas "réfléchir à" la longueur des références, tu ne la connais pas! Seul le linker la connaît! Donc si tu en fixes une, c'est sale et donne du code sous-optimal.

Et sinon, comme expliqué aussi dans le post n°3, l'assembleur optimise déjà les références sans taille explicite passée (et tu ne peux pas désactiver ça). La seule différence est que l'assembleur ne peut en optimiser qu'une partie (les références internes au fichier) alors que le linker peut optimiser tout!
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°5   Marquer comme non lu.
Folco Ecrit le: Mardi 6 décembre 2005 à 16:08 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


je suis d'accord sur le principe. j'utilise déjà (et depuis toujours en fait) l'optimisation des NOPs, car je savais à quoi ça servait.

Je vais te décrire ce que je veux faire, tu pourras me conseiller mieux:
Je veux avoir un programme qui n'ai pas de relogement (si possible), je compte rester en-dehors des 32 ko. Je veux donc pouvoir optimiser les sauts (4->2 octets si c'est possible) et réordonner les sections pour être plus efficace au cas où sur les sauts.

tous les adressages de variables que je fais pour le moment, je les faits en écrivant:
lea.l var(pc),an
move.x dn,(an)

ça prends moins de place qu'un relogement, et je trouve ça beaucoup plus propre. :)
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°6   Marquer comme non lu.
Folco Ecrit le: Mardi 6 décembre 2005 à 16:22 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


aaaaaaaaaaarghhhhhhhhhhhhh :'(:'(:'(
les jbxx ne marchent pas avec A68k :'(:'(:'(
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°7   Marquer comme non lu.
Kevin Kofler Ecrit le: Mardi 6 décembre 2005 à 16:39 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Avec A68k (qui est déprécié, je rappelle, tu devrais plutôt utiliser GNU as!), la notation est légèrement différente:
  • saut absolu optimisable: jbsr label <-> jsr label
  • saut absolu non-optimisable: jsr label.l <-> jsr (label).l
  • branchement long optimisable: bsr label <-> bsr label
  • branchement long non optimisable: bsr.w label <-> bsr.w label
  • branchement court: bsr.s label <-> bsr.s label

Les sauts absolus optimisables ne sont jamais optimisés par A68k lui-même (contrairement à GNU as, c'est pour ça que A68k ne distingue pas jsr/jbsr), même dans le même fichier, seul le linker peut les optimiser.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°8   Marquer comme non lu.
Folco Ecrit le: Mardi 6 décembre 2005 à 16:44 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


ok, merci bien. Donc si je fais que des sauts longs (<32ko) et que je ne veux pas de relogements, je ne fais donc que des bsr.
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°9   Marquer comme non lu.
Sasume Ecrit le: Mardi 6 décembre 2005 à 16:53 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Ce post ./3, il faudrait le mettre dans une faq #top#
Ou dans tiwiki. Tu es d'accord, Kevin ?
    
./Post n°10   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 7 décembre 2005 à 02:55 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Mettez ça dans TIWiki si ça vous amuse, peut-être que comme ça au moins les gens le liront.

Je sens que je devrais mettre une traduction anglaise (et réorganisée en paires question-réponse) là: http://p080.ezboard.com/ftichessteamhqfrm5.showMessage?topicID=3176.topic.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°11   Marquer comme non lu.
Folco Ecrit le: Jeudi 8 décembre 2005 à 16:03 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


tiens, un truc... j'hallucine ou A68K accepte sans rechicner le symbole '|' dans les lignes de code? avant ou après une instruction, ça compile! :D
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°12   Marquer comme non lu.
Kevin Kofler Ecrit le: Jeudi 8 décembre 2005 à 16:16 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


A68k accepte pas mal de trucs qu'il ne devrait pas accepter...
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°13   Marquer comme non lu.
Onur Ecrit le: Dimanche 11 décembre 2005 à 04:21 Déconnecté(e)    Voir le profil de Onur Envoyer un email à Onur Visiter le site WEB de Onur Envoyer un message privé à Onur  


c'est pas dramatique
Je ne veux pas faire quelque chose de bien, je cherche l'excellence:ETP Studio...


et autres projets à finir avant 2010
    
  :: Index » Forum Ti68K » Programmation Assembleur 68K » Code de démarrage en _nostub (13 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 50.89ms avec 18 requetes