Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MOI: écrit moi un algorithme de division 32 bits sur le processeur 8bits 6809. Le passage des paramètres se fera par la pile.
- Voici un algorithme de division de 32 bits sur un processeur 8 bits 6809:
- ---------------------------------
- ChatGPT: Initialisez deux registres, quotient et remainder, à 0.
- Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
- Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
- Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
- Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
- Augmentez le compteur de boucles de 1.
- Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
- Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
- Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
- Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
- Copy code
- ; Initialise les registres à 0
- clr quotient
- clr remainder
- ; Charge le dividende et le diviseur depuis la pile
- leax 2,s
- ldx ,x
- leax 4,s
- ldy ,x
- ; Gère l'erreur de division par 0
- beq divby0
- ; Initialise le compteur de boucles à 32
- ldd #32
- loop:
- ; Déplace le dividende un bit vers la gauche
- lslb
- ; Augmente le compteur de boucles de 1
- addd #1
- ; Si le dividende est maintenant supérieur ou égal au diviseur,
- ; soustrais le diviseur du dividende et ajoute 1 au quotient
- cmpy
- bcs skip
- suby
- inc quotient
- skip:
- ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
- bne loop
- ; Stocke le quotient et le reste dans les registres appropriés
- stx quotient
- sty remainder
- ; Termine l'algorithme
- rts
- divby0:
- ; Gère l'erreur de division par 0
- ...
- J'espère que cela vous aidera! Si vous avez des questions, n'hésitez pas à poser.
- ---------------------------------------
- MOI: ce n'est pas de l'assembleur 6809. Pire les registres d'adresse sont utilisés en tant qu registre de données. Le reistre X ne e fait que 16 bits et pas 32. Il est aussi plusieurs fois écrasé. Bref ce code est totalement faux
- -----------------------------------------
- OPENGPT: Je suis désolé pour cette erreur dans mon code d'exemple. Voici une version corrigée de l'algorithme de division de 32 bits sur un processeur 8 bits 6809:
- Initialisez deux registres, quotient et remainder, à 0.
- Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
- Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
- Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
- Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
- Augmentez le compteur de boucles de 1.
- Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
- Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
- Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
- Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
- Copy code
- ; Initialise les registres à 0
- clr quotient
- clr remainder
- ; Charge le dividende et le diviseur depuis la pile
- leax 2,s
- ldx ,x
- ldy ,-x
- leax 4,s
- ldx ,x
- ldy ,-x
- ; Gère l'erreur de division par 0
- beq divby0
- ; Initialise le compteur de boucles à 32
- ldd #32
- loop:
- ; Déplace le dividende un bit vers la gauche
- lslb
- ; Augmente le compteur de boucles de 1
- addd #1
- ; Si le dividende est maintenant supérieur ou égal au diviseur,
- ; soustrais le diviseur du dividende et ajoute 1 au quotient
- cmpy
- bcs skip
- suby
- inc quotient
- skip:
- ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
- bne loop
- ; Stocke le quotient et le reste dans les registres appropriés
- stx quotient
- sty remainder
- ; Termine l'algorithme
- rts
- divby0:
- ; Gère l'erreur de division par 0
- ...
- J'espère que cette version corrigée sera plus précise et utile pour vous. Si vous avez d'autres questions, n'hésitez pas à poser.
- -----------------------------------------
- MOI: quotient est reminder sont sur 8 bits si tu écris "clr quotient" .
- -----------------------------------------
- OPENGPT: Vous avez raison, je suis désolé pour cette erreur dans mon code. Dans ce cas, il faudrait utiliser une instruction différente pour initialiser quotient et remainder à 0. Pour initialiser un registre à 0 sur un processeur 8 bits 6809, vous pouvez utiliser l'instruction clrb. Voici une version corrigée de l'algorithme de division de 32 bits sur un processeur 8 bits 6809:
- Initialisez deux registres, quotient et remainder, à 0.
- Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
- Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
- Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
- Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
- Augmentez le compteur de boucles de 1.
- Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
- Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
- Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
- Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
- Copy code
- ; Initialise les registres à 0
- clrb quotient
- clrb remainder
- ; Charge le dividende et le diviseur depuis la pile
- leax 2,s
- ldx ,x
- ldy ,-x
- leax 4,s
- ldx ,x
- ldy ,-x
- ; Gère l'erreur de division par 0
- beq divby0
- ; Initialise le compteur de boucles à 32
- ldd #32
- loop:
- ; Déplace le dividende un bit vers la gauche
- lslb
- ; Augmente le compteur de boucles de 1
- addd #1
- ; Si le dividende est maintenant supérieur ou égal au diviseur,
- ; soustrais le diviseur du dividende et ajoute 1 au quotient
- cmpy
- bcs skip
- suby
- inc quotient
- skip:
- ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
- bne loop
- ; Stocke le quotient et le reste dans les registres appropriés
- stx quotient
- sty remainder
- ; Termine l'algorithme
- rts
- divby0:
- ; Gère l'erreur de division par 0
- ...
- J'espère que cette version corrigée sera plus précise et utile pour vous. Si v
- -----------------------------------------
- MOI: clrb efface le contenu du registre "b" et ne prends pas d'argument. C'est un adressage immédiat. Pour mettre à 0 une donnée 32 bits comme "quotient", il faut la découper en 4 octets, et effaer chacun de ces 4 octets par un clr.
- -----------------------------------------
- OPENGPT: Vous avez raison, je suis désolé pour cette erreur dans mon code. Pour initialiser un registre de 32 bits à 0 sur un processeur 8 bits 6809, vous pouvez découper le registre en 4 octets et utiliser l'instruction clr pour effacer chacun d'eux. Voici une version corrigée de l'algorithme de division de 32 bits sur un processeur 8 bits 6809:
- Initialisez deux registres, quotient et remainder, à 0.
- Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
- Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
- Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
- Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
- Augmentez le compteur de boucles de 1.
- Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
- Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
- Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
- Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
- Copy code
- ; Initialise les registres à 0
- clr quotient+3
- clr quotient+2
- clr quotient+1
- clr quotient
- clr remainder+3
- clr remainder+2
- clr remainder+1
- clr remainder
- ; Charge le dividende et le diviseur depuis la pile
- leax 2,s
- ldx ,x
- ldy ,-x
- leax 4,s
- ldx ,x
- ldy ,-x
- ; Gère l'erreur de division par 0
- beq divby0
- ; Initialise le compteur de boucles à 32
- ldd #32
- loop:
- ; Déplace le dividende un bit vers la gauche
- lslb
- ; Augmente le compteur de boucles de 1
- addd #1
- ; Si le dividende est maintenant supérieur ou égal au diviseur,
- ; soustrais le diviseur du dividende et ajoute 1 au quotient
- cmpy
- bcs skip
- suby
- inc quotient
- skip:
- ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
- bne loop
- ; Stocke le quotient et le reste dans les registres appropriés
- stx quotient
- sty remainder
- ; Termine l'algorithme
- rts
- divby0:
- ; Gère l'erreur de division par 0
- ...
- -----------------------------------------
- MOI: note: quotient et remainder ne sont pas des registre, mais des données en mémoire. Au fait c'est quopi cmpy ? il lui manque un argument
- -----------------------------------------
- OPENGPT: Vous avez raison, je suis désolé pour cette erreur dans mon code. Pour comparer deux nombres de 32 bits sur un processeur 8 bits 6809, vous pouvez utiliser l'instruction cmpd. Voici une version corrigée de l'algorithme de division de 32 bits sur un processeur 8 bits 6809:
- Initialisez deux variables en mémoire, quotient et remainder, à 0.
- Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
- Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
- Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
- Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
- Augmentez le compteur de boucles de 1.
- Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 à quotient.
- Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
- Stockez quotient et remainder dans les variables appropriées et terminez l'algorithme.
- Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
- Copy code
- ; Initialise les variables à 0
- clr quotient+3
- clr quotient+2
- clr quotient+1
- clr quotient
- clr remainder+3
- clr remainder+2
- clr remainder+1
- clr remainder
- ; Charge le dividende et le diviseur depuis la pile
- leax 2,s
- ldx ,x
- ldy ,-x
- leax 4,s
- ldx ,x
- ldy ,-x
- ; Gère l'erreur de division par 0
- beq divby0
- ; Initialise le compteur de boucles à 32
- ldd #32
- loop:
- ; Déplace le dividende un bit vers la gauche
- lslb
- ; Augmente le compteur de boucles de 1
- addd #1
- ; Si le dividende est maintenant supérieur ou égal au diviseur,
- ; soustrais le diviseur du dividende et ajoute 1 à quotient
- cmpd
- bcs skip
- subd
- inc quotient+3
- inc quotient+2
- inc quotient+1
- inc quotient
- skip:
- ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
- bne loop
- ; Stocke quotient et remainder dans les variables appropriées
- std quotient
- std remainder
- ; Termine l'algorithme
- rts
- divby0:
- ; Gère l'erreur de division par 0
- ...
- -----------------------------------------
- MOI: cmpd et subd manquent un argument. Pire D est un register 16bits alors qu'on veut faire une comparaison 32 bits. Et pire encore D contient l'indice de boucle. On ne peut l'utiliser en ce point du code tel quel. Peut-être faudrait-il mettrez l'indice de boucle dans une variable en mémoire et faire une compariason 32 bits correcte (attention c'est de l'arithmétique multiprécision, donc utiliser SBCA/SBCB à un moment sans doute)
- -----------------------------------------
- OPENGPT: Vous avez raison, je suis désolé pour cette erreur dans mon code. Pour comparer deux nombres de 32 bits sur un processeur 8 bits 6809, vous pouvez utiliser l'instruction cmpy en conjonction avec l'instruction cmpx. Voici une version corrigée de l'algorithme de division de 32 bits sur un processeur 8 bits 6809:
- Initialisez deux variables en mémoire, quotient et remainder, à 0.
- Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
- Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
- Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
- Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
- Augmentez le compteur de boucles de 1.
- Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 à quotient.
- Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
- Stockez quotient et remainder dans les variables appropriées et terminez l'algorithme.
- Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
- Copy code
- ; Initialise les variables à 0
- clr quotient+3
- clr quotient+2
- clr quotient+1
- clr quotient
- clr remainder+3
- clr remainder+2
- clr remainder+1
- clr remainder
- ; Charge le dividende et le diviseur depuis la pile
- leax 2,s
- ldx ,x
- ldy ,-x
- leax 4,s
- ldx ,x
- ldy ,-x
- ; Gère l'erreur de division par 0
- beq divby0
- ; Initialise le compteur de boucles à 32
- -----------------------------------------
- Bon c'est pas open GPT , mais CPT..
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement