Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 25 233 324

  • Nb. de membres 187
  • Nb. d'articles 1 270
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  OS4 toutes plateformes confondues »» Appel système en assembleur PPC sous OS4

Appel système en assembleur PPC sous OS4#124

8Contributeur(s)
JuLieNalexBatteManCentaurZcortoElwoodK-Lsinisrus
3 Modérateur(s)
K-LElwoodcorto
JuLieN JuLieNicon_post
Salut à tous!

Peut-être quelqu'un pourrait-il m'éclairer sur la manière d'ouvrir une bibliothèque et appeler une fonction sous OS4 en assembleur?

Je me suis inspiré d'un hello world en assembleur pour MorphOS mais apparemment ça ne marche pas sous OS4. Je pense que le problème vient de la nouvelle manière qu'a OS4 de passer les appels sytème, puisque j'ai lu dans le document "os4_migration_guide.pdf" du SDK (dans Documentation/Developer Info/General) que l'on doit maintenant passer par des pointeurs d'interface. Et il y a aussi une histoire de libauto un peu nébuleuse pour un programmeur 68k sous AOS3.x...

Voici mon source (pour pasm), en espérant que quelqu'un pourra me dire ce qui cloche...




#?Helloworld.p

.set?mainstack,2240
.set?mainstack2,2244

.set?reg_d0,0
.set?reg_d1,4
.set?reg_d2,8
.set?reg_a1,36
.set?reg_a6,56
.set?EmulCallDirectOS,100
.set?_LVOCloseLibrary,-552
.set?_LVOOpenLibrary,-552

.set?_LVOVPrintf,-954

.text

__start:

mflr?r0
stwu?r1,-mainstack(r1)
stw??r0,mainstack2(r1)
stw??r31,8(r1)
stw??r30,12(r1)
stw??r29,16(r1)
stw??r28,20(r1)
stw??r27,24(r1)
stw??r26,28(r1)
stw??r25,32(r1)
stw??r24,36(r1)
stw??r23,40(r1)
stw??r22,44(r1)
stw??r21,48(r1)
stw??r20,52(r1)
stw??r19,56(r1)
stw??r18,60(r1)
stw??r17,64(r1)
stw??r16,68(r1)
stw??r15,72(r1)
stw??r14,76(r1)
stw??r13,80(r1)

li???r11,4
lwz??r14,0(r11)?#?execbase?dans?r14

li???r13,0

#DEBUT?ouverture?des?bibliothèques

lis??r9,dosName@ha
stw??r13,reg_d0(r2)
addi?r9,r9,dosName@l
stw??r14,reg_a6(r2)
stw??r9,reg_a1(r2)
lwz??r0,EmulCallDirectOS(r2)
li???r3,_LVOOpenLibrary????????#?OpenLibeaey(libName,version)?(a1,d0)
mtlr?r0
blrl???????????????????????????#?call?function

mr?r15,r3

#MAIN

lis??r8,string1@ha
addi?r8,r8,string1@l
stw??r8,reg_d1(r2)???#?string
stw??r13,reg_d2(r2)??#?NULL
stw??r15,reg_a6(r2)??#?r15=DosBase
lwz??r0,EmulCallDirectOS(r2)
li???r3,_LVOVPrintf
mtlr?r0
blrl

#Fin?de?MAIN
CloseLibraries:

stw??r15,reg_a1(r2)?#?r15=DosBase
stw??r14,reg_a6(r2)
lwz??r0,EmulCallDirectOS(r2)
li???r3,_LVOCloseLibrary??#?CloseLibrary(library)?(a1)
mtlr?r0
blrl

exit:

li???r3,0??#?return?code?=?0

lwz??r14,76(r1)
lwz??r15,72(r1)
lwz??r16,68(r1)
lwz??r17,64(r1)
lwz??r18,60(r1)
lwz??r19,56(r1)
lwz??r20,52(r1)
lwz??r21,48(r1)
lwz??r22,44(r1)
lwz??r23,40(r1)
lwz??r24,36(r1)
lwz??r25,32(r1)
lwz??r26,28(r1)
lwz??r27,24(r1)
lwz??r28,20(r1)
lwz??r29,16(r1)
lwz??r30,12(r1)
lwz??r31,8(r1)
lwz??r0,mainstack2(r1)
addi?r1,r1,mainstack
mtlr?r0
blr

.type?__start,@function
.size?__start,$-__start

#DATA
dosName:
.string?"dos.library"

string1:
.string?"Hello?World!"

.sdata
.global?__amigappc__


Message édité par : JuLieN / 07-01-2008 17:54
alex alexicon_post
Je ne connais rien à l'asm. Par contre je peux t'aider sur la "nouvelle manière qu'a OS4 de passer les appels système". En C après avoir obtenu l'adresse de base de la bibliothèque ouverte (le retour d'OpenLibrary), il est *obligatoire* d'appeler la fonction Exec/GetInterface() en lui (dans l'ordre) l'adresse sus-citée, le nom de l'interface demandée (en général il s'agit de l'interface principale "main", mais par exemple Exec fournit aussi une interface "Debug", et Expansion une interface "PCI"), la version de l'interface voulue et une taglist (pour le moment NULL). Normalement cela te renvoie une structure contenant des pointeurs sur fonction qu'il te suffit d'appeler (j'imagine qu'en ASM cela doit correspondre à des adresses auxquelles il faut sauter pour réaliser l'appel). Ensuite quand tu n'as plus besoin de l'interface tu appel Exec/DropInterface() et ensuite tu closes ta lib.
Voilà il y a ensuite juste le cas de la librairie Exec pour lequel tu ne peux pas faire appel ni à OpenLibrary() ni à GetInterface() puisque ces fonctions sont justement contenues dans Exec, pour avoir ExecBase normalement c'est le startup code de ton compilo qui le passe à ta fonction, je ne sais pas comment ça se passe en ASM mais sinon tu peux toujours aller voir à 0X4 mais c'est pas conseillé car plus lent (exception de page je crois me souvenir), ensuite pour obtenir l'interface IExec il suffit d'aller regarder dans le champ MainInterface de la structure ExecBase...
Voilà c'est tout ce que je peux faire pour toi...

Ah si dernière chose, les paramètres se passent sur la pile dans l'ordre et il *faut* ajouter le pointeur de l'interface comme premier paramètre de chaque fonction, par exemple pour GetInterface en fait les paramètres sont :
IExec, libbase, "main", 1, 0L
JuLieN JuLieNicon_post
Merci Alex d'avoir pris le temps de répondre. Je vais essayer de faire avec ça. En fait, OS4 est beaucoup plus proche d'Aros (qui transmet aussi les paramètres via la pile). MorphOS et OS3.x utilisent les registres du processeur.
----------------------
Pourquoi sont-ce toujours ceux qui ont tort qui ne sont jamais d'accord avec moi?
BatteMan BatteManicon_post
Oh, un JuLieN !

Bon, j'ai aucune idée de la réponse, mais j'en profite pour te faire un petit coucou, depuis le temps ;-)

--
/me espère que c'est bien JuLieN et pas un autre Julien ;-)

[b][EDIT][/b]
D'après le profil, c'est bien JuLieN !! Cool ;-)
[b][/EDIT][/b]
Message édité par : BatteMan / 07-01-2008 18:58
JuLieN JuLieNicon_post
Oui, c'est bien le JuLieN qui ne met plus les pieds sur AI.

Salut Batti ;-)

Comme tu vois, je me suis offert OS4 classic pour noël, et c'est bien sympa.
----------------------
Pourquoi sont-ce toujours ceux qui ont tort qui ne sont jamais d'accord avec moi?
CentaurZ CentaurZicon_post
@JuLieN

Pour ce que tu veux faire, je te conseille de compiler sans les optimisations ni la libauto un programme en C super simple (genre, ouvrir la dos.library puis IDOS->Delay(50) ;-)...) puis de le désassembler : objdump -d monprogramme.

Enfin sinon, comme explique Alex il faut passer l'interface comme premier paramètre, donc en asm ça veut dire que r3 doit contenir l'adresse de l'interface (IExec par exemple), et r4 = premier paramètre, etc...

Message édité par : CentaurZ / 07-01-2008 20:25
alex alexicon_post
Ah oups, il semble que je "m'a trompé" on passe bien les paramètres dns les registres, mais ça dot être fait automatiquement par le compilo C alors.... Désolé :-?
JuLieN JuLieNicon_post
Juste pour vous dire que ça y est, j'ai résolu le problème (avec les conseils de quelques uns sur le site UtilityBase, dont l'ami Corto ;-) )

Je vais nettoyer tout cet affreux code pondu par gcc et vous montrerai un Hello World présentable dès que possible! :b
----------------------
Pourquoi sont-ce toujours ceux qui ont tort qui ne sont jamais d'accord avec moi?

Message édité par : JuLieN / 10-01-2008 23:32
corto cortoicon_post
Salut

Ca y est, j'ai pris le temps de regarder de plus près ce sujet qui m'intéresse aussi.

Pour voir ce que donne un hello en assembleur ou comment sont faits les appels systèmes, il suffit de faire le prog en C correspondant et "gcc -O2 -S source.c" donne le code assembleur (ou "vc -O2 -S source.c", ça peut être intéressant de comparer).

Sur OS4, les appels systèmes sont faits comme un appel C classique :
- registres dans r3, r4, r5, ...
- saut avec sauvegarde de l'adresse dans le registre lr

Donc pour un OpenLibrary("dos.library", 50), on a :
- dans r3 l'adresse de l'interface IExec
- dans r4 l'adresse de la cha?ne
- dans r5 la version

Pour l'appel lui-même :
- gcc utilise le registre ctr dans lequel il met l'adresse de la fonction chargé avec un offset par rapport à IExec, puis appelle "bctrl" (saut à l'adresse contenue dans ctr et met l'adresse de la prochaine instruction dans lr)
- vbcc utilise le registre lr directement avec là aussi l'adresse de la fonction et qu'il appelle avec "blrl" (saut à l'adresse contenue dans lr et en même temps met dans lr l'adresse de la prochaine instruction)

Voilà ce que j'en ai compris. MorphOS utilise quant à lui un wrapper, passant les arguments dans les pseudo-registres 68k.
Elwood Elwoodicon_post
@JuLieN

J'espère qu'on verra bientôt un programme un peu plus "utile" qu'un Hello world ;-)

Je suis très friand de nouveaux programmes pour OS4 :-)
--
Philippe Ferrucci
Avec une Sam460 et AmigaOS 4.1, je suis eco-responsable. Cool !
Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme