CODING ★ AS : ASINED ★

Assembleur ACPC n°14 - AS: ÇA C'EST COOL
Encore et toujours un petit cours assembleur de plus, c'est toujours ça de gagné. En ce qui concerne le titre, je n'en suis pas peu fier, il m'a été inspiré par Marillion, un groupe de "Hard" qui chante le morceau Assassing, dans l'album Fugazi. Comme mon Walk-man béton me pulvérise les tympans sur ce titre, je tenais à vous le faire savoir.

Je prends la parole quelques minutes pour vous annoncer une nouvelle importante : Celtic, celui, bien connu de tous, de qui j'écorche toujours le nom. s'en est. lui aussi, allé en guerre, sous les drapeaux. Un de plus, Septh par exemple, et la boucle est bouclée (je ne lui souhaite pas ce mal et espère qu'il en sera dispensé). Bref, nos lignes sont décimées une à unes par la Défense nationale française. En un mot : Jvoujuryenamar !!! Revenons à nos octets, après avoir travaillé sur un petit scrolling en mode deux qu'il ne tient qu'à vous de modifier pour qu'il fonctionne dans les autres modes. Après un affichage de scores de type simple, voici l'art et la manière de programmer et penser en binaire, de la meilleure façon possible : en binaire. Cela paraît simple à dire, mais essayez de bien comprendre le fin fond de la chose. Nous allons aborder, ce mois-ci, la multiplication de huit bits par huit bits, en assembleur. Mais, avant tout, nous allons étudier de près ce qu'est réellement une multiplication en décimal, et, pour ce faire, retourner à l'école, comme quand nous étions petits, tout petits.

L'ECOLE HEOPTERE

Comment cela ? Héoptère n'est pas dans le dictionnaire ? Mais c'est normal, je viens de l'inventer ! Ce terme signifie simplement retour dans le passé précipité par un barbare de service avide d'Académie française. Donc, lorsque nous étions encore à l'école, nous avons appris à faire des multiplications. Le principe de cette opération connue de tous est assez simple : en clair, c'est additionner un nombre de fois données, un autre nombre à lui-même. Exemple, 2 x 3 est égal à trois plus trois. Si vous pratiquez de cette manière pour multiplier un nombre par un autre en assembleur, vous allez perdre un temps fou dans des dédales de boucles à n'en plus finir, du genre en veux-tu, en voilà, on s'amuse, on rigole, agaga, agaga ! En fait le moyen mathéma-thique efficace pour multiplier un nombre par un autre est d'additionner les uns après les autres les multiples de dix de ce nombre, le nombre de fois donné par la puissance de dix respective du multiplicateur qui est dans ce cas le second nombre. Exemple : 108 x 32 - (108 + 108) + (1080 + 1080 + 1080) Si vous avez compris cela, vous avez tout compris. Dans le cas contraire, retournez au début de ce chapitre autant de fois qu'il le faudra car c'est la clef de cet article. Pour faire une multiplication en assembleur, il faut simplement procéder de la même manière, soit additionner les différents multiples de deux (c'est la base deux, soit le binaire) du nombre à multiplier, en fonction du bit correspondant du multiplicateur.

Exemple : 1101 x 1010 - 0 + 11010 + 0 + 1101000

Pourquoi rajoute-t-on un zéro en disant qu'il fallait multiplier par deux ? Parce que, en binaire, la puissance d'un nombre ne va pas de multiples de dix en multiples de dix comme en décimal (base dix), mais de multiples de deux en multiples de deux. Pourquoi n'a-t-on pas développé les zéros qui ornent le résultat ? Parce que. en binaire, soit il y a quelque chose, soit il n'y a rien. De ce fait, soit on additionne quelque chose, soit on ne le fait pas. C'est clair, net, et concis. Dans l'exemple sus-cité, il est facile de voir que 1101 (13) x 1010 (10) est bien égal à 11010 (26) + 1101000 (104) soit 130.

ORG &9000
; HL = HL * L
MULB8 PUSH DE ; Sauvegarde
PUSH BC ; de
PUSH AF ; registres influences
XOR A ; A vaut zero
OR L ; L vaut-il zero aussi ?
JR Z,RETOUR ; Si oui, on ce casse
LD E,L ; E=L
LD D,A ; DE=L
LD A,H ; A=H
OR A ; H valait-il zero?
JR Z,RETOUR ; Si oui , faut se barrer maintenant
LD HL,0 ; Je ne sais quoi dire
LD B,8 ; Nombre de bits a decaler
START RRA ; Le bit de droite de A vaut-il 1
JR NC,PASADD ; Si il faut zero on additionne pas
ADD HL,DE ; Dans le cas contraire , on le fait
PASADD SLA E ; Decalage a gauche de DE
RL ; Soit sa multiplication par 2
DJNZ START ; On fait ceci huit fois
SORS POP AF ; Restitution
POP BC ; Des
POP DE ; Registres preserves
RET ; Retour al'envoyeur
RETOUR LD HL,0 ; Resultat egal a zero
JR SORS ; Voir la bonne remaque

Voici donc l'algorithme de cette routine :

Avant tout, pour rappeler, il faut mettre un nombre dans H, l'autre dans L, et le résultat se retrouvera dans le double registre HL. Pour ne pas détruire l'environnement du programme, nous sauvons DE qui servira aux additions de registres doubles, BC parce que B contient le compteur, et AF car A sera le témoin de la triste opération. Dans le cas où l'un des opérateurs est à zéro, le résultat est nul. Nous testons alors les deux opérandes pour savoir si ce cas ne se présente pas. S'il existe, la routine rend immédiatement la main en influençant le résultat final. Ensuite, comme le résultat se trouvera dans HL, on transfère l'une des opérandes dans DE, et l'autre dans A La première sur seize bits pourra donc subir des décalages lui permettant de prendre des multiples de deux sans qu'un débordement ne vienne fausser le résultat, et A montrera si l'addition de l'opérande avec le résultat doit se faire ou non.
Les variables sont ensuite initialisées. B contient le nombre de passes à effectuer, et HL est mis à zéro. Vient maintenant la partie la plus importante de la routine qui concerne le traitement des opérandes. On décale A à droite pour récupérer son bit de poids faible. Si ce bit vaut un, alors on additionne DE au résultat. Dans le cas contraire, rien ne se passe. Il faut ensuite, comme si on était en base 10, ajouter un zéro à DE en le décalant à gauche. Comme il n'existe pas d'opérations de décalages seize bits, nous nous y prenons en deux temps. Premièrement décaler à gauche l'octet de poids faible en poussant tous ses bits vers la gauche et en mettant, dans la place libre, un zéro. Vous faites ça tous les matins avec votre tube de dentifrice. De ce fait, le bit le plus à gauche se casse la figure dans la retenue (carry), comme le fait le dentifrice sur la brosse à dents. Deuxièmement, faire la même chose sur le registre D, sauf que le bit de droite ne sera pas un zéro mais bien le bit précédemment tombé dans la retenue. Ce qui tombe alors du bit de poids fort de D n'a aucune importance (je peux même vous assurer que ça sera tout le temps un zéro).

Cette opération sera répétée huit fois, soit le nombre de bits contenus dans A. Ainsi, nous aurons bien fait la multiplication de huit bits par huit bits. sans perdre une miette, ni de précision, ni de temps. Bien entendu, il existe moult raccourcis pour effectuer des multiplications de nombres simples, mais nous avons bien le temps de les aborder dans les prochaines pages.

Comme l'opération est finie, il nous suffit de dépiler les registres que nous avions préalablement empilés, sans se poser de questions. Comme vous pouvez le remarquer, les registres sont dépilés dans l'ordre inverse duquel ils ont étés stockés. De cette manière, nous sommes bien sûrs que les bonnes valeurs retourneront aux bons endroits.

GRAS, FILS, MEUHHH

The next month, we'll speak about the screen's memory of the CPC (ceux qui ne causent pas rosbif sont bien embêtés). Si ce mois-ci ça n'a pas été fait, c'était simplement pour vous montrer comment programmer en assembleur, en vivant assembleur et en pensant assembleur. La meilleure manière de programmer un micro-ordinateur est de se plier à toutes ses contraintes pour les transformer en avantages non négligeables. Si vous désirez programmer des petites routines en assembleur, mais que vous ne savez pas comment faire, faites-nous signe par l'intermédiaire du courrier, nous serons heureux de vous dépanner. Nous vous souhaitons de passer de bons moments aussi savoureux que casse-tête, et que le mois vous soit profitable et bénéfique. A bon programmeur, salut.

Sined le loubarbare , A100% n°13

Page précédente : Bidouilles ACPC n°12 - Création de RSX
★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tools:
» asm13DATE: 2012-08-27
DL: 31
TYPE: ASM
SiZE: 2Ko
NOTE:

» asm13bDATE: 1970-01-01
DL: 29
TYPE: ASM
SiZE: 2Ko
NOTE:

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Bidouilles ACPC n°16 - Bidouilles bizarres
» Coding » Bidouilles ACPC n°31 - RSX
» Coding » Bidouilles ACPC n°32
» Coding » Bidouilles ACPC n°03 - Catalogue décorés
» Coding » Assembleur ACPC n°44 - La programmation HARD du PSG
» Coding » Bidouilles ACPC n°45 - Les vecteurs system (3/6)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop
Page créée en 684 millisecondes et consultée 1763 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.