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 » Début en ASM 68k (15 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
bobti89 Ecrit le: Vendredi 14 janvier 2005 à 15:09 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

Voila, on a comencé en cours une introduction à l'asm68k et on doit décrire exactement ce que fait un prog. Seulement il y a une ligne que je comprends pas, j'ai l'impression qu'il y a une erreur !
Voila le code :
DONNEES  EQU  $4000
PROGRAM  EQU  $4600

        ORG     $4000
NOMBRE  DS.W    1
CHAINE  DS.B    4


        ORG     $4600

PRINCIPAL       MOVE.W  #$5566, NOMBRE
                MOVE.L  #CHAINE,-(A7)  
                MOVE.W  NOMBRE,-(A7)
                JSR     BINHEX  

                RTS


BINHEX          MOVEM.L D0-D2/A0,-(A7)        
                MOVEQ   #3,D1        
                MOVE.W  16+4(A7),D2        
                MOVEA.L 16+6(A7),A0        
                ADDA.L  #04,A0        
                  
BOUCLE          MOVE.B  D2,D0
                ANDI.B  #$0F,D0        
                JSR  CHIFFHEX        
                MOVE.B  D0,-(A0)        
                LSR.W  #4,D2              
                DBRA  D1,BOUCLE        
                MOVEM.L  (A7)+,D0-D2/A0        
                MOVE.L  (A7),6(A7)        
                ADDA.L  #6,A7        
                RTS
CHIFFHEX        CMP.B  #$0A,D0        
                BLT.S   ADDZ        
                ADD.B   #'A'-'0'-$0A,D0            
ADDZ            ADD.B   #'0',D0        

                RTS
        END     $4600
        END     $4000

Je ne comprends pas cette ligne :
ADD.B #'A'-'0'-$0A,D0
En fait je ne vois pas ce que vient faire le '0' au milieu...

Ce programme est sensé traduire en hexadecimale.

Merci :)

PS : J'aimerais aussi savoir comment faire pour compiler ce programme sous TIGCC.
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°1   Marquer comme non lu.
geogeo Ecrit le: Vendredi 14 janvier 2005 à 15:32 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


'0' correspond au code ASCII du caractère 0 donc 48
Ainsi ADD.B #'A'-'0'-$0A,D0
Ne fait que
Ajoute 65-Contenu se trouvant à l'adresse 48=0x30-10 à D0?
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°2   Marquer comme non lu.
bobti89 Ecrit le: Vendredi 14 janvier 2005 à 15:45 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

Oui mais naturellement j'aurais fait :
ADD.B #55,D0
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°3   Marquer comme non lu.
geogeo Ecrit le: Vendredi 14 janvier 2005 à 17:34 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Je sais pas si '0' est la valeur 48 ou c'est la valeur à l'adresse 48=0x30!
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°4   Marquer comme non lu.
Sasume Ecrit le: Vendredi 14 janvier 2005 à 17:59 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

bobti89 :
Je ne comprends pas cette ligne :
ADD.B #'A'-'0'-$0A,D0
En fait je ne vois pas ce que vient faire le '0' au milieu...
Le '0' signifie "code ASCII de 0". C'est pareil que le 'A'. Sauf que c'est un 0 au lieu d'un A.
Ça a été écrit comme çapour plus de lisibilité (ça permet de retrouver la sémantique du code).
Lors de l'assemblage, l'assembleur va calculer l'expression derrière le # et mettre sa valeur : 'A' - '0' - $0A = 65 - 48 - 10 = 7.
Donc la ligne est équivalente à :
 ADD.B #7,D0

Mais là on ne sait pas d'où sort le 7 ! On ne comprend pas à quoi il correspond, pourquoi 7 et pas 12 ?!
Tandis qu'avec l'expression d'origine, on comprend qu'on transforme un nombre en chaine contenant une représentation du nombre en base 16 !
    
./Post n°5   Marquer comme non lu.
bobti89 Ecrit le: Vendredi 14 janvier 2005 à 18:07 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

Justement, il faut ajouter 55 et pas 7 !
Moi j'aurais ecrit :
ADD.B #'A'-$0A,D0
C'est pour ca que je comprends pas...

ex :
15 donne F en hexa
or 15+7 != 'F'
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°6   Marquer comme non lu.
Sasume Ecrit le: Vendredi 14 janvier 2005 à 18:13 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Non puisqu'à l'instruction suivante, on a un add.b #'0',d0, donc les deux à la suite nous font qqch d'équivalent à add.b #7+48,d0 <=> add.b #55,d0.
On retombe sur nos pattes :)
    
./Post n°7   Marquer comme non lu.
bobti89 Ecrit le: Vendredi 14 janvier 2005 à 18:17 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

Ah oui, c'est vrai :)
Merci !
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°8   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 14 janvier 2005 à 19:22 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  


Argh, pas très optimisé, ce code...
                MOVE.L  #CHAINE,-(A7)

Vu l'adresse, un pea CHAINE.w ferait l'affaire.

                JSR     BINHEX

Allô? bsr appelle! :D Voire un bra puisque c'est un tailcall, voire rien du tout vu que la routine appelée se situe juste en dessous...

Il y a aussi des adda où des addq suffiraient.


-Edité le Vendredi 14 janvier 2005 à 19:23 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°9   Marquer comme non lu.
Sasume Ecrit le: Vendredi 14 janvier 2005 à 19:27 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Kevin, c'est un exemple pédagogique. Un BSR aurait été mieux c'est clair, ou un JSR BINHEX.w, mais cela aurait été une mauvaise idée de mettre un BRA (surtout que ça n'aurait pas compilé), ou même rien du tout.
    
./Post n°10   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 14 janvier 2005 à 19:35 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  


Un bra aurait compilé (bra.w)...
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.
bobti89 Ecrit le: Vendredi 14 janvier 2005 à 20:59 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

lol, c'est surrement pas optimisé car il faut que ce soit compréhensible !
C'est la première fois qu'on voit un code asm, et c'est déjà assez dur à comprendre comme ca !

En tout cas je crois que j'ai presque tout compris et je suis content :)
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°12   Marquer comme non lu.
bobti89 Ecrit le: Samedi 15 janvier 2005 à 15:30 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

J'aimerais que vous commentiez mon premier programme.
Une partie viens du tuto de squale et une autre du topic sur les debuts de orion_ (d'ailleurs quand on voit ce qu'il fait aujourd'hui !).

Voici le code :
section ".data" 
 include "OS.h"

 xdef _nostub
 xdef _ti89
  
_main:
  link     a6,#0 
  move.l     $c8,a5
  
  ;sauvegarde l'ecran
  pea.l     3840
  move.l     HeapAllocPtr*4(a5),a0
  jsr     (a0)
  move.l     a0,d4
  tst.l     d4
  beq     nomem
  move.l     #3840,(a7)
  pea.l     LCD_MEM
  move.l     d4,-(a7)
  move.l     memcpy*4(a5),a0
  jsr     (a0)
  
  ;affiche "Hello, World!" en 30,0
  move.w    #4,-(a7)
  pea.l    string(pc)
  move.w    #0,-(a7)
  move.w    #30,-(a7)
  move.l    DrawStr*4(a5),a0
  jsr     (a0)
  
  ;attend qu'on appuie sur une touche
  move.l    ngetchx*4(a5),a0
  jsr    (a0)
  
  ;restore l'ecran
  pea.l     3840
  move.l     d4,-(a7)
  pea.l     LCD_MEM
  move.l     memcpy*4(a5),a0
  jsr     (a0)
  move.l     d4,(a7)
  move.l     HeapFreePtr*4(a5),a0
  jsr     (a0)
  nomem:
  unlk     a6
  rts
  
string: dc.b "Hello, World!",0
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°13   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 15 janvier 2005 à 15:33 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 manque la sauvegarde des registres d4 et a5 que tu détruis.
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°14   Marquer comme non lu.
bobti89 Ecrit le: Lundi 17 janvier 2005 à 19:17 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

Ok.

J'ai essayé de compiler le premier programme, mais j'ai une adresse error, pourquoi ?
code:
include "OS.h"
 xdef _ti89
 xdef _nostub


_main:
                move.w   #$5566,nombre
                pea      chaine  
                move.w  nombre,-(A7)       
                movem.l D0-D2/A0,-(A7)        
                moveq   #3,D1        
                move.w  16+4(A7),D2        
                movea.l 16+6(A7),A0        
                addq.l  #04,A0        
                  
boucle:         move.b  D2,D0
                andi.b  #$0F,D0        
                jsr      chiffhex        
                move.b  D0,-(A0)        
                lsr.w    #4,D2              
                dbra      D1,boucle      
                movem.l  (A7)+,D0-D2/A0        
                move.l  (A7),6(A7)        
                adda.l  #6,A7        
                rts
chiffhex:       cmp.b  #$0A,D0        
                blt.s   addz     
                add.b   #'A'-'0'-$0A,D0            
addz:           add.b   #'0',D0        

                rts
        
nombre:  dc.w    0
chaine: dc.b    0,0,0,0

Bien sûr, s'il y a des optimisations, je les veux bien :)
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°15   Marquer comme non lu.
Kevin Kofler Ecrit le: Lundi 17 janvier 2005 à 20: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  


Le problème, c'est que le code exemple utilise une convention très bizarre pour le passage de paramètres: c'est la routine appelée qui restaure la pile ("callee pops"):
                MOVE.L  (A7),6(A7)        
                 ADDA.L  #6,A7        
                 RTS

Ce genre de convention est généralement utilisé sur les processeurs qui ont une instruction RTD pour ça. Sur le 68000, c'est très bizarre, et aucune fonction de la calculatrice fonctionne comme ça. Donc il faudra te passer de cette habitude au plus vite. Cette convention d'appel bizarre a la fâcheuse habitude d'empêcher l'optimisation du tailcall, donc il faudra effectivement mettre un bsr binhex et un rts. Et aussi désactiver l'optimisation du linker ("Optimize Returns") qui va te le virer.

Mais la bonne correction est d'utiliser la convention d'appel standard, qui est "caller pops".
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!
    
  :: Index » Forum Ti68K » Programmation Assembleur 68K » Début en ASM 68k (15 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 75.05ms avec 18 requetes