Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur - l'instruction "Move"
(Article écrit par Little Zeus et extrait d'A-News (Amiga News) - octobre 1988)
|
|
Continuons sur la lancée du mois dernier. Rappelons brièvement qu'en gros, l'assembleur
consistait en un échange de valeurs entre différentes cases mémoires et que, pour ceci, nous utilisons l'instruction de
base, Move.
Move
Eh oui, c'est grâce à elle que nous pourrons faire "transiter" des variables entre différentes adresses. Elle nous permettra
tout aussi bien de prendre des valeurs d'autre part ; expliquons-nous :
Voyons en premier lieu ce que nous voulons dire par "transiter" (traduction du verbe "to move"). Ce mot est en fait inapproprié
au contexte et "copier" serait plus juste. En fait, "MOVE $100,d0" ne prend pas la valeur comprise en $100 pour la mettre
en d0, mais MOVE copie le contenu de $100 en d0, c'est-à-dire qu'en admettant qu'il y ait 4 en $100, après l'exécution
de cette instruction, le chiffre 4 sera aussi bien en $100 qu'en d0 et malgré ce que nous aurions pu croire, la case $100
ne s'est pas vidée au profit de d0. Peut-être, trouverez-vous que j'insiste inutilement, mais il est primordial que cette
notion soit bien comprise.
$ et #
Attention à ne pas confondre "MOVE $100,d0" avec "MOVE #100,d0" : un caractère changé et les effets ne sont plus les mêmes.
Dans le dernier cas, nous écrasons l'ancien contenu de d0 pour y mettre la valeur #100 et veuillons noter que 100 est un
nombre décimal dans la mesure où il est nullement précédent d'un "$" qui aurait alors voulu dire que nous avions à faire
à un hexadécimal. Si nous avions voulu y mettre $100, nous aurions écrit MOVE #$100,d0. Nous venons en fait de voir, sans
le savoir, deux modes d'adressages qui portent respectivement les noms d'adressages absolus et immédiats. Précisons que
chacun de ces modes possède différents modes d'utilisation. En ayant dit précédemment que "MOVE $100,d0" recopiait la valeur
comprise dans $100 en d0, nous avons été imprécis ; il aurait mieux valu dire que l'instruction recopiait les valeurs comprises
en $100 et $101 en d0, c'est-à-dire que MOVE agit sur deux octets.
Il apparaît donc évident que l'instruction MOVE agit par défaut sur deux octets. Nous pourrions penser, que comme l'Amiga
est un 16/32 bits (c'est-à-dire qu'il peut traiter des informations ayant jusqu'à 32 bits de longueur) MOVE pourrait peut-être
traiter plus d'un mot à la fois et nous aurions raison car elle peut tout aussi bien traiter quatre octets à la fois (un long mot)
qu'un seul.
Il faut néanmoins préciser à la machine quel type de variable elle doit traiter et pour cela, nous faisons suivre l'instruction
MOVE de ".W" pour un mot (facultatif), de ".L" pour un long mot et de ".B" pour un octet.
d0
Mais au fait, ne faudrait-il pas préciser que d0 n'est pas une case mémoire comme toutes les autres ? Eh oui, elle fait partie
des registres internes à l'Amiga. Les huit registres commençant par "d" et suivi d'un chiffre compris entre 0 et 7 font partie
des registres de données. Ceux-ci ont une longueur de 32 bits contrairement aux cases mémoires habituelles.
Pourquoi, me demanderez-vous, ces registres existent-ils ? En fait, ils permettent certaines opérations que les cases mémoires
usuelles ne nous offrent pas comme ce que nous avons vu précédemment, le fait de copier un contenu d'une case à
une autre. Nous verrons plus exactement leurs rôles très prochainement.
Récapitulatif
Nous allons récapituler tout ceci par un petit tableau afin que cela soit clair dans nos esprits.
Immédiat |
Absolu |
octet lmove.b #valeur, destinationl |
move.b départ, arrivée |
mot lmove.w #valeur, destination |
lmove.w départ, arrivée |
long motlmove.l #valeur, destination |
lmove.l départ, arrivée |
Vérifions que nous avons tout bien assimilé : après un "MOVE.L #$FFFFFFFF,d0" suivi de "MOVE.B #$12,d0". Quel est alors le
nouveau contenu de d0 ? J'entends $12 ! Non, le nouveau contenu de d0 est "$FFFFFF12". Si on voulait maintenant avoir $12
en d0, il faudrait faire un "MOVE.L #$12,d0".
Instructions ADD et SUB
Les instructions ADD, qui s'occupent des additions, et SUB, qui s'occupe de la soustraction, procèdent exactement de la même
façon que MOVE. Par exemple "MOVE.L #52,d0" suivi de "ADD.L #$3,d0" additionnera $3 au contenu de d0, en l'occurrence,
$2+$3 et on aura à la suite de ces deux instructions, le nombre $5 en d0. Nous verrons cela plus précisément le mois prochain.
A la prochaine
Ce que nous venons de voir jusqu'à présent peut paraître très théorique mais nous ne pouvons malheureseusement pas faire une
routine sans avoir les éléments de base. Ne nous inquiétons tout de même pas, dès le
prochain numéro, nous taperons notre
première routine en assembleur qui possédera un intérêt certain.
|