1

voilà, j'aimerais juste organiser un mini concours.
Pour participer, il faut écrire la fonction factorielle en ASM 68k.

Voici une version en C:

int fact(int n) {
 if( n == 0) { return 1; }
 else { return n*fact(n-1); }
}


comme je suis gentil, ici int c'est les entiers 16 bits

deux contraintes: l'argument est passé sur la pile (en 4(sp)), le retour doit être dans d0

edit: c'est un concours sans prix à gagner hein wink

2

fact:  tst.w     (4,SP)    ; if( n == 0)
       BEQ.S     end
       move.w    (4,SP),D0
       subq.w    #1,D0     ; n-1
       move.w    D0,-(SP)  ; (n-1)
       BSR       fact      ; fact(n-1)
       addq.l    #2,SP     ; On dépile (n-1)
       muls.w    (4,SP),D0 ; return n*fact(n-1)
       RTS

end:   moveq.w   #1,D0     ; return 1;
       RTS


Oula, je vois que mon assembleur date un peu smile J'ai tapé ça de tête... Par contre gaffe la pile, j'ai fait récursif, le mieux est de faire une boucle avec tampon smile

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

3

Kochise :
       muls.w    (4,SP),D0 ; return n*fact(n-1)


On reconnait le gars qui a l'habitude de faire du code 68030 wink


GT cow
avatar
Accrochez vous ca va être Cerebral !!

4

Pour ce qui est de l'utilisation de fonction récursive et passage de paramètres par la pile, je doute qu'on puisse faire beaucoup mieux que Kochise, sinon on peut faire une bête boucle:
        move #1,d1
        move #valeur_depart,d0
boucle:
        mulu d0,d1
        dbne d0,boucle
Web: http://pmandin.atari.org/
Programmeur Linux, Atari
Spécialité: Développement, jeux

5

-

6

oui, Patrice, on peut tout à fait retirer la récursion comme tu l'as dit mais là, c'est pas le but

bon, en fait, je me suis trompé, c'est plus intéressant si les int sont des int32

donc Kochise, pourrais-tu stp changer pour des int 32 bits

(pour la multiplication 32 x 32 -> 32, supposons qu'on ait la bonne fonction mul32 qui prend les deux paramètres sur la pile et qui renvoie le résultat dans d0)



7

c'est quoi le but du concours ??
taille ?
vitesse ?

sinon, je ne vois pas comment tu veux stocker le resultat d'une multplication de deux ".L" dans un ".L" confus

8

bon, ok, j'aurais pu intituler ce post "polémique C/ASM" mais j'avais pas envie

en fait, j'ai été plutôt étonné par le code produit par gcc et j'aurais aimé
plus de contributions pour voir ce que ça donne

sinon, la multiplication .L x .L dans .L, bah en tronquant!



9

-

10

SebRmv :
[...]en fait, j'ai été plutôt étonné par le code produit par gcc[...]

Positivement ou négativement ? Depuis 1998 et la nouvelle norme ISO, les compilos sont dotés d'un nouveau cerveau et pondent en général un code proche d'un assemblage alamano smile Gcc est pas trop mal foutu dans le domaine !
Orion_ :
dehors

Bah oui, forcément :

	lea	p(PC),A0
	move.l	(4,SP),D0
	move.l	(0,A0,D0.w*4),D0
	RTS
p:	dc.l	1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600


Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

11

-

12

Ouuuuuups !

Bwa, à l'origine la Jaguar devait embarquer deux 68030, donc hein, pouet pouet !

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

13

Kochise :
Positivement ou négativement ? Depuis 1998 et la nouvelle norme ISO, les compilos sont dotés d'un nouveau cerveau et pondent en général un code proche d'un assemblage alamano smile.gif
On doit pas avoir les mêmes mains alors grin
(ouais, je sais, on va pas recommencer à troller là-dessus wink )
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

14

Kochise
:
SebRmv :
[...]en fait, j'ai été plutôt étonné par le code produit par gcc[...]

Positivement ou négativement ? Depuis 1998 et la nouvelle norme ISO, les compilos sont dotés d'un nouveau cerveau et pondent en général un code proche d'un assemblage alamano smile Gcc est pas trop mal foutu dans le domaine !


plutôt positivement en fait
je posterai tout à l'heure ce qu'il nous pond (attention à la syntaxe gnu gol )

15

Zerosquare
:
Kochise :
Positivement ou négativement ? Depuis 1998 et la nouvelle norme ISO, les compilos sont dotés d'un nouveau cerveau et pondent en général un code proche d'un assemblage alamano smile.gif
On doit pas avoir les mêmes mains alors grin
(ouais, je sais, on va pas recommencer à troller là-dessus wink )


je crois que j'ai passé trop de temps sur JSII ces derniers-temps
ça me donne envie de troller un peu grin

16

SebRmv :
ça me donne envie de troller un peu biggrin.gif
non

avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

17

Orion_ :
	lea	p(pc),a0
	move.l	4(sp),d0
	lsl.l	#2,d0
	move.l	0(a0,d0.w),d0
	rts
p:	dc.l	1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600


dehors



Orion on est demomaker ou on l'est pas, mais toi tu l'est !!!


GT calin Orion

Qu'importe les moyens, c'est le résultat qui compte !!!
avatar
Accrochez vous ca va être Cerebral !!

18

SebRmv :
bon, ok, j'aurais pu intituler ce post "polémique C/ASM" mais j'avais pas envie

en fait, j'ai été plutôt étonné par le code produit par gcc et j'aurais aimé
plus de contributions pour voir ce que ça donne

sinon, la multiplication .L x .L dans .L, bah en tronquant!


Vu qu'on est sur Jag, on a la phrase (8 octets soit 2 longs) donc on tronque pas non


GT dehors
avatar
Accrochez vous ca va être Cerebral !!

19

alors voilà, chose promise, chose due, voici ce que donne gcc (syntaxe gcc couic)

_fact:
        link a6,#-4
        tstl a6@(8)
        jne L2
        moveq #1,d0
        movel d0,a6@(-4)
        jra L1
        .even
L2:
        movel a6@(8),d0
        subql #1,d0
        movel d0,sp@-
        jbsr _fact
        addql #4,sp
        mulsl a6@(8),d0
        movel d0,a6@(-4)
L1:
        movel a6@(-4),d0
        unlk a6
        rts


ok, j'entends d'ici certains compères qui commencent à rigoler
je vous l'accorde, le code ci-dessus n'est pas très performant

d'abord, règlons le cas des link/unlk qui sont inutiles ici (si vous avez quelques notions de compilation, a6 représente le "frame pointer")

ajoutons donc l'option -fomit-frame-pointer, cela donne:

_fact:
        subqw #8,sp
        tstl sp@(12)
        jne L2
        moveq #1,d0
        movel d0,sp@
        jra L1
        .even
L2:
        movel sp@(12),d0
        subql #1,d0
        movel d0,sp@-
        jbsr _fact
        addql #4,sp
        mulsl sp@(12),d0
        movel d0,sp@
L1:
        movel sp@,d0
        addqw #8,sp
        rts


là, c'est déjà un peu mieux et à l'époque où j'ai désassemblé AviPlay de Dieter Fiebelkorn, je n'aurais pas ralé après tous ces link/unlk (qui me semblaient inutiles alors que je n'y connaissais rien en compilation)

voyons voir maintenant ce que donne l'option -O2

_fact:
        movel d2,sp@-
        movel sp@(8),d2
        moveq #1,d0
        tstl d2
        jeq L1
        movel d2,a0
        pea a0@(-1)
        jbsr _fact
        mulsl d2,d0
        addql #4,sp
        .even
L1:
        movel sp@+,d2
        rts


en fait, c'est là que j'ai été un peu surpris par l'utilisation de pea pour calculer (n-1) et en même temps empiler le paramètre
(je n'aurais jamais pensé à ça en fait !)
je suis content d'avoir appris cette optim en tout cas smile

enfin, voici ce que donne gcc quand on donne comme processeur m68000 au lieu de m680x0 (par défaut), avec -fomit-frame-pointer et -O2
_fact:
        movel a2,sp@-
        movel sp@(8),a2
        moveq #1,d0
        cmpw #0,a2
        jeq L1
        pea a2@(-1)
        jbsr _fact
        movel d0,sp@-
        movel a2,sp@-
        jbsr ___mulsi3
        lea sp@(12),sp
        .even
L1:
        movel sp@+,a2
        rts


on remarque que là ce n'est plus mulsl qui est utilisé mais une fonction auxiliaire qui émule cette multiplication longue (modulo 2^32)

alors, vos impressions?

20

SebRmv :
alors voilà, chose promise, chose due, voici ce que donne gcc (syntaxe gcc couic)
enfin, voici ce que donne gcc quand on donne comme processeur m68000 au lieu de m680x0 (par défaut), avec -fomit-frame-pointer et -O2
_fact:
        movel a2,sp@-
        movel sp@(8),a2
        moveq #1,d0
        cmpw #0,a2
        jeq L1
        pea a2@(-1)
        jbsr _fact
        movel d0,sp@-
        movel a2,sp@-
        jbsr ___mulsi3
        lea sp@(12),sp
        .even
L1:
        movel sp@+,a2
        rts


on remarque que là ce n'est plus mulsl qui est utilisé mais une fonction auxiliaire qui émule cette multiplication longue (modulo 2^32)

alors, vos impressions?



La syntaxe GGC désolé mais elle est assez illisible confus J'en perds mon assembleur

GT dehors
avatar
Accrochez vous ca va être Cerebral !!

21

Et oui, la démonstration que les compilos se démerdent très bien et prennent en charge les prises de tête et nous permet de nous concentrer sur les algorithmes et les problèmes de plus haut niveau ! Sans le C, on n'aurait pas d'interface graphique, pas d'internet, etc... Vous êtes pas d'accords ? Alors essayez de le faire en assembleur, recodez l'AES/GEM en assembleur, Highwire en assembleur, etc...

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

22

-

23

Kochise :
Et oui, la démonstration que les compilos se démerdent très bien et prennent en charge les prises de tête et nous permet de nous concentrer sur les algorithmes et les problèmes de plus haut niveau ! Sans le C, on n'aurait pas d'interface graphique, pas d'internet, etc... Vous êtes pas d'accords ? Alors essayez de le faire en assembleur, recodez l'AES/GEM en assembleur, Highwire en assembleur, etc...

Kochise


Oulalala terrain glissant :

snap.jpg

Topaze, editeur de map multi résol (Mono au TC Falcon) marche du STF au Falcon CT60, charge aussi bien du NEO que tu TGA (Système de modules). Interface graphique complete, formulaires en fenetres, raccourci claviers, etc.... Icones sur le bureau et pas une seule ligne de C, rien que du pur assembleur, et il tourne meme normalement sur un STE !! Malgré la lenteur du Gem. Et tout cela pour 44 petits kilos !! Essaie de faire pareil allez soyons bon prince en moins de 100 Kilos fou

Je penses pas que ton compilo C quelqu'il soit puisse faire mieux qu'un programmeur. Et aucune prise de tete, a part les bétises du Gem.


GT Pour l'assembleur top

Edit : P.S. : Coopy tu as vu il y a meme ton module dedans wink
avatar
Accrochez vous ca va être Cerebral !!

24

GT Turbo
:
Kochise :
Et oui, la démonstration que les compilos se démerdent très bien et prennent en charge les prises de tête et nous permet de nous concentrer sur les algorithmes et les problèmes de plus haut niveau ! Sans le C, on n'aurait pas d'interface graphique, pas d'internet, etc... Vous êtes pas d'accords ? Alors essayez de le faire en assembleur, recodez l'AES/GEM en assembleur, Highwire en assembleur, etc...

Kochise


Oulalala terrain glissant :

Topaze, editeur de map multi résol (Mono au TC Falcon) marche du STF au Falcon CT60, charge aussi bien du NEO que tu TGA (Système de modules). Interface graphique complete, formulaires en fenetres, raccourci claviers, etc.... Icones sur le bureau et pas une seule ligne de C, rien que du pur assembleur, et il tourne meme normalement sur un STE !! Malgré la lenteur du Gem. Et tout cela pour 44 petits kilos !! Essaie de faire pareil allez soyons bon prince en moins de 100 Kilos fou

Je penses pas que ton compilo C quelqu'il soit puisse faire mieux qu'un programmeur. Et aucune prise de tete, a part les bétises du Gem.


GT Pour l'assembleur top

Edit : P.S. : Coopy tu as vu il y a meme ton module dedans wink

oui, terrain glissant, car c'est vrai, on peut tout faire en ASM même un compilateur C
évidemment, un programmeur ASM peut toujours faire du meilleur code qu'un compilo
mais il ne faut pas oublier le facteur temps dans cette comparaison

si on fait un concours "écrire topaze en moins de 24h" alors il est fort probable que celui qui aura choisi le C sera plus avancé que celui qui aura choisi l'ASM. (si tant est que les deux programmeurs aient environ le même niveau en programmation)

25

-

26

Kochise
:
SebRmv :
[...]en fait, j'ai été plutôt étonné par le code produit par gcc[...]

Positivement ou négativement ? Depuis 1998 et la nouvelle norme ISO, les compilos sont dotés d'un nouveau cerveau et pondent en général un code proche d'un assemblage alamano smile Gcc est pas trop mal foutu dans le domaine !

Mais n'importe quoi, quel est le rapport avec C99 ? Et j'aurais plutôt tendance à penser que pour les "vieilles" plateformes style 68k qui sont plus trop maintenues, un compilo comme Gcc ne s'améliore pas avec le temps, bien au contraire, il "pourrit" :/
Kochise :
Et oui, la démonstration que les compilos se démerdent très bien

Quelle démonstration confus

Orion_ :
dehors

Bah oui, forcément :

	lea	p(PC),A0
	move.l	(4,SP),D0
	move.l	(0,A0,D0.w*4),D0
	RTS
p:	dc.l	1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600

Euh, tu fais le malin mais c'est encore loin d'être optimal -- tu pourrais utiliser un adressage pc-relatif, et ne charger que 16 bits dans d0 tongue

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

27

Orion_ :
GT > (ta oublier de preciser le nombre de ligne de code wink )


Seb exact, en vitesse c'est plus long a developper, mais l'utilisateur ce qu'il veut c'est un programme rapide et pas un developpement rapide. J'ai essayé Topaze sur un STE, ca tourne bien, mais alors sur un Falcon CT60 en TC, j'ai un scroll temps réel oui Je te montrerais a la RGC.

Orion regarde la différence fondamentale entre le C et l'ASM :

Le C moins de ligne mais gros programmes, l'ASM plein de lignes mais petit prog wink

(Pour infos Topaze fait 22700 lignes grin en un seul fichier (wink SCPCD et Orion) )


GT Un pro asm king
avatar
Accrochez vous ca va être Cerebral !!

28

Pollux tout a fait d'accord avec toi mais il n'y a pas d'indication de facteur d'échelle sur un 68000 pas de d0.w*4 wink


GT Un 68000 shhh
avatar
Accrochez vous ca va être Cerebral !!

29

-

30

Orion_ :
ah ça je dit pas wink
mais disont que le C c'est pour les flemard ^^ (et parfois je le suis un peu tongue )


Ou les gars qui ont la meme signature que moi grin


GT poisson
avatar
Accrochez vous ca va être Cerebral !!