Code minimal ASM ?

Forum Amiga Coding Code minimal ASM ?

  • Ce sujet contient 5 réponses, 4 participants et a été mis à jour pour la dernière fois par donamiga, le il y a 4 années et 10 mois.
  • Créateur
    Sujet
  • #96100
    donutman
      • Level 1
      • Messages : 15

      Hello c’est encore moi,

      bon promis, je ne vais pas vous spammer avec des questions sur l’ASM à tout bout de champs… mais je bloque sur un petit truc curieux…

      Suivant les liens donnés par lexomil, je suis tombé sur une petite intro à l’ASM du 68000. En particulier cette page.
      Premier tuto… et premier truc que je ne comprends pas…

      Voici mon code :

      ;*** Try and retry ****
      
      ; Ecrire que des 1 en LONG dans d0 puis que des 0 en .W puis que AA en .B
      ; Penser ensuite à taper a (assemble) j (jump) et x (vérifier les registres)
      ; On s'attend à lire D0 : FFFF00AA
      
      move.l #$FFFFFFFF,d0
      move.w #$0000,d0
      move.b #$AA,d0
      end 

      Or voici que j’obtiens à l’éxecution :

      ** LineA Emulator Raised At $00063FE6
      D0: FFFF00BF 00000020 00000000 00000000 00000000 00000000 00000000 00000000
      A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00038F94
      SSP=0007FFFA USP=00038F94 SR=0008 -- -- PL=0 -N--- PC=00063FE6
      PC=00063FE6 A820 LINE_A #$0820

      LineA Emulator c’est un message d’erreur ? (je ne le trouve pas dans la doc de l’ASM…) Pourquoi n’ai je pas FFFF00AA dans d0 au final ?

      Merci d’avance :)

      Donut

    Affichage de 5 réponses de 1 à 5 (sur un total de 5)

    Partager sur vos réseaux sociaux préférés :
    Facebooktwitterredditpinterestlinkedintumblrmail

    • Auteur
      Réponses
    • #96101
      donutman
        • Level 1
        • Messages : 15

        Hello,

        je me réponds à moi-même (la nuit porte conseil).

        LineA emulator raised n’est pas une erreur mais une exception.

        La doc de l’ASM indique à ce sujet :

        10.2 Exceptions

        Normally when we want some special routine to be executed,
        we just execute it as a subroutine. If something special hap-
        pens, the processor can also execute some special routines,
        these are called exceptions. An exception routine is ended
        with a »RTE« instead of a »RTS« in a subroutine.

        […]

        LINE_A Emulator

        Not all possible opcodes are used on the MC68000 processor,
        some are reserved for later use. Especially all commands star-
        ting with the bit combination »%1010« or »%1111«. All com-
        mands starting with »%1010 = $A« are called »UNE_A«
        commands. You can use these commands to make your own
        commands or to emulate floating point commands.

         

        Bon je ne suis pas sûr de bien comprendre de quoi il s’agit ici ni pourquoi cette exception est levée… En revanche tout est rentré dans l’ordre lorsque j’ai remplacé « end » par « rts » (que j’avais oublié). Pas sûr de bien comprendre la différence entre « end » et « rts »… « end » semble indiquer à l’assembleur la fin du code, « rts » dit qu’il doit revenir ?



        #96104
        lexomil
          • Level 3
          • Messages : 80

          question simple, tu utilises quel assembleur actuellement ?

          #96105
          donutman
            • Level 1
            • Messages : 15

            Hello,

            j’utilise ASMTwo que j’ai récupéré à cette adresse : http://coppershade.org/articles/More!/Downloads/

             

            Donut

            #96106
            slack
              • Level 7
              • Messages : 465

              En assembleur 68k, on appelle une sous routine par un « jsr » qui signifie « Jump to Subroutine ».

              On termine le code de la sous-routine par un « rts » qui signifie « Return from Subroutine ».

              Je sais qu’un programme amiga peut se terminer par un « rts ». Dans ce cas, je pense que lorque tu assembles, ton assembleur traduit en code machine les 3 « move » et le « rts » puis lorsque tu lui demande d’executer ton code, il l’appelle par un « jsr ». Dans ce cas, cela doit fonctionner.

              Par contre, si tu termine ton code par un « end » qui signifie que son travail de traduction est terminé, ton assembleur traduit en code machine les 3 « move », puis appelle ton code par un jsr. Ton processeur execute les 3 « move » puis le code qui suit et qui est imprévisible. C’est pour cela que tu as cette erreur surprenante.

              Peux-tu executer ton programme en pas à pas, c’est à dire instruction par instruction ? Cela te permettrait de voir les instructions executées et leurs conséquences sur les registres ?

              #100527
              donamiga
                • Level 5
                • Messages : 249
                ;*** Try and retry ****
                
                ; Ecrire que des 1 en LONG dans d0 puis que des 0 en .W puis que AA en .B
                ; Penser ensuite à taper a (assemble) j (jump) et x (vérifier les registres)
                ; On s'attend à lire D0 : FFFF00AA
                
                move.l #$FFFFFFFF,d0
                move.w #$0000,d0
                move.b #$AA,d0
                end 

                pourquoi de long discours pour un truc aussi simple : toujours terminer un prog par RTS

                move.l #-1,d0
                move.w #0,d0
                move.b #$AA,d0

                RTS

                 

              Partager sur vos réseaux sociaux préférés :
              Facebooktwitterredditpinterestlinkedintumblrmail
              Affichage de 5 réponses de 1 à 5 (sur un total de 5)
              • Vous devez être connecté pour répondre à ce sujet.