Appendix C
ASM : le manuel de référence
C.1 Présentation d’asm
Le logiciel asm est un mini assembleur susceptible de générer du code pour
la machine virtuelle simplifiée mac. Ce code "objet" peut être exécuté, sous
contrôle d’un metteur au point, sur le simulateur de cette machine, sim.
C.2 Spécifications du logiciel asm
Il lit ses entrées sur stdin, génère le code, sous forme symbolique, sur stdout, et
signale les erreurs sur stderr. Sous UNIX, il est mis en oeuvre par la commande
asm. Le code fourni est compatible avec les entrées attendues par le logiciel
sim, et il est possible d’écrire :
asm < toto.asm | sim
pour assembler et exécuter immédiatement le programme.
C.3 Format des instructions
Le format général des instructions acceptées par asm est le suivant :
[ étiquette : ] [ code-opération [ opérande ] ] <fin-de-ligne>
Une fin de ligne étant le caractère CR (et/ou LF), ou un commentaire débutant
par le caractère * et se terminant par CR (et/ou LF). Ex:
boucle: ld.l r4,tab(r2) * Element suivant
85
86
APPENDIX C. ASM : LE MANUEL DE RÉFÉRENCE
Le format est libre, un blanc devant séparer le code-opération de l’opérande.
L’assembleur ne tient pas compte de la casse (majuscule ou minuscule) des let-
tres.
L’étiquette est un identificateur alphanumérique, c’est-à-dire une suite de
lettres et de chiffres débutant par une lettre.
Le code-opération peut éventuellement être suivi de .L pour préciser que
le format de l’instruction est long. Dans la plupart des cas, cette précision est
inutile.
Les constantes, sur 16 bits, peuvent s’exprimer sous forme décimale (235),
hexadécimale (0xa30c), binaire (0b1111000000110101) ou caractère (’xy’).
Les opérandes acceptés correspondent à la syntaxe suivante :
registre R0 àR15 ex: R12
registre, registre ex: R2,R4
registre, constante ex: R5,3
registre, identificateur ex: R8,total
registre, identificateur(registre) ex: R6,table(R2)
registre,(registre) ex: R4,(R7)
identificateur ex: suite
identificateur(registre) ex: table(R2)
constante ex: 0x2fc3
constante, constante ex: ’c’,0
Dans la quasi-totalité des cas, il est nécessaire d’utiliser le préfixe "#" devant
une constante pour indiquer une opération immédiate :
LD.L R2,0x3f4 Le registre R2 reçoit le contenu du mot mémoire d’adresse
0x3f4.
LD.L R2,#0x3f4 Le registre R2 reçoit la valeur hexadécimale 0x3f4.
Le suffixe .L indique que l’opération est une instruction longue (sur 4 octets) :
LD R2,#12 Le registre R2 reçoit la valeur 12 car l’instruction créée est
0x012C.
LD.L R2,#0x3f4 Le registre R2 reçoit la valeur 0x3f4 car l’instruction créée
est 0x812003f4.
LD R2,#0x3f4 L’assembleur ne peut générer une constante courte : il assem-
ble l’instruction au format long comme ci-dessus.
LD.L R2,#12 Le registre R2 reçoit la valeur décimale 12, mais l’instruction
est explicitement créée au format long : 0x8120000C.
C.3. FORMAT DES INSTRUCTIONS
87
C.3.1 Directives de l’assembleur
ORG {origin}
Syntaxe :
ORG constante
Indique que les instructions seront implémentées à partir de l’adresse pré-
cisée par la constante. ex:
ORG 0x200
L’adresse précisée est une adresse d’octet. Elle doit être paire.
BSS {Block Started by Symbol}
Syntaxe :
BSS constante
Réserve à l’adresse courante une zone de mémoire de taille égale à la
valeur de la constante. Cette valeur est un nombre d’octets.
DATA
Syntaxe :
DATA constante
Définit à l’adresse courante une constante de type mot [16 bits]. La con-
stante peut éventuellement s’exprimer sous la forme d’un couple de deux
constantes 8 bits, séparées par une virgule, et représentant les octets de
poids fort et de poids faible du mot à créer.
START
Syntaxe :
START étiquette
Définit le point d’entrée du programme (adresse de la première adresse à
exécuter).
88
APPENDIX C. ASM : LE MANUEL DE RÉFÉRENCE
C.3.2 Instructions de l’assembleur
L’assembleur reconnaît toutes les instructions décrites dans la documentation
relative à la machine. Il offre une souplesse (limitée) sur les points suivants :
Quand une instruction nécessite manifestement un format "long", alors
que ".L" n’a pas été précisé comme suffixe de l’opération, il considère que
le format long est implicite. C’est le cas d’instructions telles que :
add r3,#2f1
ld r5,toto
pour lesquelles un format court ferait perdre une partie du sens (premier
cas, constante réduite à "1"), ou ne permettrait pas un assemblage correct
de l’instruction (second cas).
Les instructions push,pop,jsr et ret font référence explicitement à
un registre de pile. Si ce registre n’est pas précisé dans l’instruction,
l’assembleur considérera qu’il s’agit du registre 15, et générera le code
en conséquence.
L’instruction trap permet de préciser un niveau et un sous-niveau
d’interruption, sous la forme de deux constantes séparées par une virgule.
Si une seule constante est spécifiée, l’assembleur considérera qu’il s’agit
du sous-niveau, et utilisera 13 comme niveau, correspondant aux "appels
du superviseur".
Signalons enfin que l’assembleur transmet en sortie les commentaires
débutant par trois astérisques. De tels commentaires sont reconnus
comme des ordres d’impression par le simulateur, et permettent ainsi de
documenter du code source et du code objet.
C.3.3 Format du code objet
L’assembleur génère un code objet "absolu" (c’est à dire qu’il doit être chargé à
une adresse précise de la mémoire). Ce code est composé de directives destinées
au simulateur, consistant en une succession de directive /addr pour spécifier
une adresse de chargement suivie d’une directive /w pour indiquer la valeur
d’un ou de plusieurs mots devant chargés en mémoire à partir de l’adresse in-
diquée. Si une directive start a été utilisée dans le programme, l’assembleur
générera une commande /run pour le simulateur.
C.4. EXEMPLES
89
C.4 Exemples
C.4.1 Calcul de PGCD
Le programme ci-dessous reprend un exemple donné en cours : le calcul du
PGCD de deux nombres.
*** PGCD org 0x1000
pgcd: cmp r2,r3
jeq fin
jlt suite
ld r0,r3
ld r3,r2
ld r2,r0
suite: sub r3,r2
jmp pgcd
fin: ret r15
*
main: la.l r15,pile
ld.l r2,#1144
ld.l r3,#858
jsr r15,pgcd
ld.l r3,#1287
jsr r15,pgcd
* Pour avoir un resultat
ld r0,r2
trap 3
trap 2
*** Resultat attendu : 143
halt
bss 16
pile: bss 0
start main
Quelques remarques sur cet exemple :
Le programme définit explicitement une zone attribuée à la pile, de taille
16 (instruction bss 16). Comme la pile opère "en remontant" vers les adresses
basses, la valeur affectée au registre désignant la pile doit être celle de la fin
de la zone. Ici, cette adresse est obtenue en plaçant l’étiquette après la décla-
ration de la zone de 16 octet. Cette étiquette est associée à la déclaration d’un
bloc de taille zéro, mais le même effet aurait été obtenu en plaçant simplement
l’étiquette seule dans sa ligne.
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !