Advertisement
Guest User

Untitled

a guest
Dec 21st, 2022
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.31 KB | None | 0 0
  1. MOI: écrit moi un algorithme de division 32 bits sur le processeur 8bits 6809. Le passage des paramètres se fera par la pile.
  2. Voici un algorithme de division de 32 bits sur un processeur 8 bits 6809:
  3.  
  4. ---------------------------------
  5.  
  6. ChatGPT: Initialisez deux registres, quotient et remainder, à 0.
  7. Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
  8. Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
  9. Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
  10. Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
  11. Augmentez le compteur de boucles de 1.
  12. Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
  13. Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
  14. Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
  15. Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
  16.  
  17. Copy code
  18. ; Initialise les registres à 0
  19. clr quotient
  20. clr remainder
  21.  
  22. ; Charge le dividende et le diviseur depuis la pile
  23. leax 2,s
  24. ldx ,x
  25. leax 4,s
  26. ldy ,x
  27.  
  28. ; Gère l'erreur de division par 0
  29. beq divby0
  30.  
  31. ; Initialise le compteur de boucles à 32
  32. ldd #32
  33.  
  34. loop:
  35. ; Déplace le dividende un bit vers la gauche
  36. lslb
  37.  
  38. ; Augmente le compteur de boucles de 1
  39. addd #1
  40.  
  41. ; Si le dividende est maintenant supérieur ou égal au diviseur,
  42. ; soustrais le diviseur du dividende et ajoute 1 au quotient
  43. cmpy
  44. bcs skip
  45. suby
  46. inc quotient
  47.  
  48. skip:
  49. ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
  50. bne loop
  51.  
  52. ; Stocke le quotient et le reste dans les registres appropriés
  53. stx quotient
  54. sty remainder
  55.  
  56. ; Termine l'algorithme
  57. rts
  58.  
  59. divby0:
  60. ; Gère l'erreur de division par 0
  61. ...
  62. J'espère que cela vous aidera! Si vous avez des questions, n'hésitez pas à poser.
  63.  
  64. ---------------------------------------
  65.  
  66. 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
  67.  
  68. -----------------------------------------
  69.  
  70. 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:
  71.  
  72. Initialisez deux registres, quotient et remainder, à 0.
  73. Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
  74. Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
  75. Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
  76. Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
  77. Augmentez le compteur de boucles de 1.
  78. Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
  79. Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
  80. Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
  81. Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
  82.  
  83. Copy code
  84. ; Initialise les registres à 0
  85. clr quotient
  86. clr remainder
  87.  
  88. ; Charge le dividende et le diviseur depuis la pile
  89. leax 2,s
  90. ldx ,x
  91. ldy ,-x
  92. leax 4,s
  93. ldx ,x
  94. ldy ,-x
  95.  
  96. ; Gère l'erreur de division par 0
  97. beq divby0
  98.  
  99. ; Initialise le compteur de boucles à 32
  100. ldd #32
  101.  
  102. loop:
  103. ; Déplace le dividende un bit vers la gauche
  104. lslb
  105.  
  106. ; Augmente le compteur de boucles de 1
  107. addd #1
  108.  
  109. ; Si le dividende est maintenant supérieur ou égal au diviseur,
  110. ; soustrais le diviseur du dividende et ajoute 1 au quotient
  111. cmpy
  112. bcs skip
  113. suby
  114. inc quotient
  115.  
  116. skip:
  117. ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
  118. bne loop
  119.  
  120. ; Stocke le quotient et le reste dans les registres appropriés
  121. stx quotient
  122. sty remainder
  123.  
  124. ; Termine l'algorithme
  125. rts
  126.  
  127. divby0:
  128. ; Gère l'erreur de division par 0
  129. ...
  130. 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.
  131.  
  132. -----------------------------------------
  133.  
  134. MOI: quotient est reminder sont sur 8 bits si tu écris "clr quotient" .
  135.  
  136. -----------------------------------------
  137.  
  138. 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:
  139.  
  140. Initialisez deux registres, quotient et remainder, à 0.
  141. Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
  142. Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
  143. Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
  144. Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
  145. Augmentez le compteur de boucles de 1.
  146. Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
  147. Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
  148. Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
  149. Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
  150.  
  151. Copy code
  152. ; Initialise les registres à 0
  153. clrb quotient
  154. clrb remainder
  155.  
  156. ; Charge le dividende et le diviseur depuis la pile
  157. leax 2,s
  158. ldx ,x
  159. ldy ,-x
  160. leax 4,s
  161. ldx ,x
  162. ldy ,-x
  163.  
  164. ; Gère l'erreur de division par 0
  165. beq divby0
  166.  
  167. ; Initialise le compteur de boucles à 32
  168. ldd #32
  169.  
  170. loop:
  171. ; Déplace le dividende un bit vers la gauche
  172. lslb
  173.  
  174. ; Augmente le compteur de boucles de 1
  175. addd #1
  176.  
  177. ; Si le dividende est maintenant supérieur ou égal au diviseur,
  178. ; soustrais le diviseur du dividende et ajoute 1 au quotient
  179. cmpy
  180. bcs skip
  181. suby
  182. inc quotient
  183.  
  184. skip:
  185. ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
  186. bne loop
  187.  
  188. ; Stocke le quotient et le reste dans les registres appropriés
  189. stx quotient
  190. sty remainder
  191.  
  192. ; Termine l'algorithme
  193. rts
  194.  
  195. divby0:
  196. ; Gère l'erreur de division par 0
  197. ...
  198. J'espère que cette version corrigée sera plus précise et utile pour vous. Si v
  199.  
  200. -----------------------------------------
  201.  
  202. 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.
  203.  
  204. -----------------------------------------
  205.  
  206. 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:
  207.  
  208. Initialisez deux registres, quotient et remainder, à 0.
  209. Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
  210. Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
  211. Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
  212. Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
  213. Augmentez le compteur de boucles de 1.
  214. Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 au quotient.
  215. Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
  216. Stockez le quotient et le reste dans les registres appropriés et terminez l'algorithme.
  217. Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
  218.  
  219. Copy code
  220. ; Initialise les registres à 0
  221. clr quotient+3
  222. clr quotient+2
  223. clr quotient+1
  224. clr quotient
  225. clr remainder+3
  226. clr remainder+2
  227. clr remainder+1
  228. clr remainder
  229.  
  230. ; Charge le dividende et le diviseur depuis la pile
  231. leax 2,s
  232. ldx ,x
  233. ldy ,-x
  234. leax 4,s
  235. ldx ,x
  236. ldy ,-x
  237.  
  238. ; Gère l'erreur de division par 0
  239. beq divby0
  240.  
  241. ; Initialise le compteur de boucles à 32
  242. ldd #32
  243.  
  244. loop:
  245. ; Déplace le dividende un bit vers la gauche
  246. lslb
  247.  
  248. ; Augmente le compteur de boucles de 1
  249. addd #1
  250.  
  251. ; Si le dividende est maintenant supérieur ou égal au diviseur,
  252. ; soustrais le diviseur du dividende et ajoute 1 au quotient
  253. cmpy
  254. bcs skip
  255. suby
  256. inc quotient
  257.  
  258. skip:
  259. ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
  260. bne loop
  261.  
  262. ; Stocke le quotient et le reste dans les registres appropriés
  263. stx quotient
  264. sty remainder
  265.  
  266. ; Termine l'algorithme
  267. rts
  268.  
  269. divby0:
  270. ; Gère l'erreur de division par 0
  271. ...
  272.  
  273. -----------------------------------------
  274.  
  275. 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
  276.  
  277. -----------------------------------------
  278.  
  279. 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:
  280.  
  281. Initialisez deux variables en mémoire, quotient et remainder, à 0.
  282. Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
  283. Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
  284. Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
  285. Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
  286. Augmentez le compteur de boucles de 1.
  287. Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 à quotient.
  288. Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
  289. Stockez quotient et remainder dans les variables appropriées et terminez l'algorithme.
  290. Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
  291.  
  292. Copy code
  293. ; Initialise les variables à 0
  294. clr quotient+3
  295. clr quotient+2
  296. clr quotient+1
  297. clr quotient
  298. clr remainder+3
  299. clr remainder+2
  300. clr remainder+1
  301. clr remainder
  302.  
  303. ; Charge le dividende et le diviseur depuis la pile
  304. leax 2,s
  305. ldx ,x
  306. ldy ,-x
  307. leax 4,s
  308. ldx ,x
  309. ldy ,-x
  310.  
  311. ; Gère l'erreur de division par 0
  312. beq divby0
  313.  
  314. ; Initialise le compteur de boucles à 32
  315. ldd #32
  316.  
  317. loop:
  318. ; Déplace le dividende un bit vers la gauche
  319. lslb
  320.  
  321. ; Augmente le compteur de boucles de 1
  322. addd #1
  323.  
  324. ; Si le dividende est maintenant supérieur ou égal au diviseur,
  325. ; soustrais le diviseur du dividende et ajoute 1 à quotient
  326. cmpd
  327. bcs skip
  328. subd
  329. inc quotient+3
  330. inc quotient+2
  331. inc quotient+1
  332. inc quotient
  333.  
  334. skip:
  335. ; Répète la boucle jusqu'à ce que le compteur de boucles atteigne 0
  336. bne loop
  337.  
  338. ; Stocke quotient et remainder dans les variables appropriées
  339. std quotient
  340. std remainder
  341.  
  342. ; Termine l'algorithme
  343. rts
  344.  
  345. divby0:
  346. ; Gère l'erreur de division par 0
  347. ...
  348.  
  349. -----------------------------------------
  350.  
  351. 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)
  352.  
  353. -----------------------------------------
  354.  
  355. 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:
  356.  
  357. Initialisez deux variables en mémoire, quotient et remainder, à 0.
  358. Chargez les deux nombres à diviser, le dividende et le diviseur, depuis la pile.
  359. Si le diviseur est égal à 0, sautez à l'étape 8 pour gérer l'erreur de division par 0.
  360. Initialisez un compteur de boucles à 32 (pour diviser un nombre de 32 bits).
  361. Déplacez le dividende un bit vers la gauche (ce qui équivaut à multiplier le dividende par 2).
  362. Augmentez le compteur de boucles de 1.
  363. Si le dividende est maintenant supérieur ou égal au diviseur, soustrais le diviseur du dividende et ajoutez 1 à quotient.
  364. Répétez les étapes 5 à 7 jusqu'à ce que le compteur de boucles atteigne 0.
  365. Stockez quotient et remainder dans les variables appropriées et terminez l'algorithme.
  366. Voici un exemple de code en langage assembleur 6809 pour mettre en œuvre cet algorithme:
  367.  
  368. Copy code
  369. ; Initialise les variables à 0
  370. clr quotient+3
  371. clr quotient+2
  372. clr quotient+1
  373. clr quotient
  374. clr remainder+3
  375. clr remainder+2
  376. clr remainder+1
  377. clr remainder
  378.  
  379. ; Charge le dividende et le diviseur depuis la pile
  380. leax 2,s
  381. ldx ,x
  382. ldy ,-x
  383. leax 4,s
  384. ldx ,x
  385. ldy ,-x
  386.  
  387. ; Gère l'erreur de division par 0
  388. beq divby0
  389.  
  390. ; Initialise le compteur de boucles à 32
  391.  
  392.  
  393. -----------------------------------------
  394.  
  395. Bon c'est pas open GPT , mais CPT..
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement