doc

publicité
Cours 8 : Mémoire et Registres
Q8.1 : À l’aide de la datasheet du cœur ARM ou d’un simulateur, dites quels bits
formeraient l’instruction ARM MOV R3,#4 ?
0xE3A03004
Q8.2 : Supposons des nombres signés sur 8bits. Sous quelles conditions les additions
suivantes change-t-elles les drapeaux C et V de l’ALU (si elles le peuvent!):
-
Nombre Positif + Nombre Positif
Nombre Positif + Nombre Négatif
Nombre Négatif + Nombre Négatif
Positif + Positif :
C est toujours 0. V est 1 si le bit MSB de la somme est 1 (Somme supérieure à 127), 0 sinon.
Positif + Négatif :
V est toujours 0. Le bit carry est 1 si le résultat de l’opération est positif, 0 sinon.
Négatif + Négatif :
C est toujours 1. V est 1 si le bit MSB de la somme est 0 (Somme inférieure à -128), 0 sinon.
Q8.3 : Pourquoi faut-il 4 bits pour désigner le registre source ou destination d’une
opération dans le cœur ARM?
Parce que le cœur ARM a 16 registres.
Q8.4 : Supposons que R0 = 11111111h; R2 = 22222222h; R3 = 33333333h; R4 =
44444444h. Le contenu de quelles adresses se retrouvera dans R5 suite aux instructions
suivantes:
1) LDR R5,[R0]
2) LDR R5,[R0,R1,ASL#2]
3) LDR R5,[R0,#4]!
1) R5 = Mem[11111111h]
2) R5 = Mem[33333331h]
3) R5 = Mem[11111115h]
Q8.5 : Quelle(s) instruction(s) pourrions-nous utiliser pour mettre les deux bits LSB de R0
à 0? pour les mettre à 1? Les autres bits ne doivent pas changer et la valeur initiale des bits
est inconnue.
AND R0, R0, #-4
ORR R0,R0,#3
Q8.6 : Écrivez un programme qui multiplie par 2 un entier signé placé en mémoire sur 32
bits. Supposez que ce nombre commence à l’adresse 02000000h et qu’il finisse à l’adresse
02000003h (Little Endian).
AdresseDeVar
DC32 0x02000000
…
LDR R0, AdresseDeVar
LDR R1, [R0]
MOV R1, R1, ASL#1
STR R1, [R0]
Q8.7 : Quelle instruction permet d’inverser le signe d’un nombre ? Donnez une
combinaison de deux instructions ayant 1 seule opérande conduisant au même résultat.
Supposons que R2 contiennent le nombre à multiplier par -1 :
MOV R1,#-1
MUL R2,R2,R1
MVN R2,R2
ADD R2,R2,1
Q8.8 : Dites si les instructions de déplacement ou d’accès à la mémoire qui suivent sont
légales ou illégales :
MOV R1, MaVar ;Illégal
MOV R1, #4
;Légal
MOV #4, R1
;Illégal
LDR R1,[MonAdresse]
;Illégal
LDR R1,[R0]
;Légal
LDR R1,[R0,#4] ;Légal
LDR R1,[R0,MonOffset] ;Illégal
Q8.9 : Quelle est la différence entre LDR et LDM?
L’instruction LDR lit une seule valeur en mémoire pour la mettre dans le registre visé. LDM
lit plusieurs valeurs pour les mettre dans plusieurs registres
Q8.10 : À quoi sert le « ! » dans l’instruction LDR ou STR ?
Changer la valeur du registre désignant l’adresse de mémoire avant ou après l’opération.
Q8.11 : Retrouve-t-on le nom des variables et des fonctions dans la mémoire du
microprocesseur ? Si oui, comment ? Si non, pourquoi ?
Non, le microprocesseur travaille avec des adresses seulement.
Q8.12 : Quelle directive assembleur permet de déclarer des tableaux de constantes?
DC
Q8.13 : Vous voulez effectuer l’opération a = b + c + d. Sachant que a, b, c et d sont des
variables déclarées avec DS, donnez une séquence d’instructions permettant de faire cette
addition.
LDR R0,=a
LDR R1,=b
LDR R2,=c
LDR R3,=d
LDR R4,[R1]
LDR R5,[R2]
LDR R6,[R3]
ADD R4,R5,R6
STR R4,[R0]
Q8.14 : Comment change-t-on les drapeaux de l’ALU. À quoi servent-ils ?
Presque toutes les instructions ARM peuvent changer les drapeaux de l’ALU avec l’option S.
Les drapeaux changent en fonction du résultat de l’opération arithmétique ou logique. Ils
servent à évaluer des conditions (exemple : si a>8).
Q8.15 : Pourquoi le cœur ARM ne supporte pas d’instruction pour faire des décalages ou
des rotations de bits ?
En raison du barrel shifter dans l’ALU : il est possible de faire des rotations de
décalages/rotations de bits avec presque toutes les instructions microprocesseur. Pour décaler
un bit vers la droite de R1, par exemple, on peut utiliser MOV R1, R1, ASR #1
Q8.16 : Expliquez pourquoi, lorsqu’on décale des bits vers la droite de 1, il faut
habituellement copier le bit le plus significatif à gauche ?
Pour conserver le signe d’un nombre négatif
Q8.17 : Lorsque vous encodez l’instruction ADD R0, R1, #constante, quelles sont les
valeurs permises de la constante et pourquoi?
Offset peut valeur de -256 à 255. L’instruction est sur 32 bits et 9 bits sont réservés à la valeur
de la constante, les autres bits étant pour l’opcode et les autres paramètres.
Q8.18 : Si on suppose un microprocesseur ARM ayant deux registres seulement et un
ordinateur ayant une mémoire RAM qui commence à l’adresse 0x20000000. En assumant
que toutes les variables sont réutilisées plus loin, comment seraient assemblées les
opérations mathématiques suivantes :
int A,B,C,D,E //Les variables sont sur 32bits
A=3
B=4
C = A+B
D = A+B+C+5
La première chose à faire est d’assigner une adresse à A,B,C,D et E, comme le font
l’assembleur et l’éditeur de lien. Choisissons arbitrairement que A aura l’adresse 0x20000000,
B aura l’adresse 0x20000004, C aura l’adresse 0x20000008, D aura l’adresse 0x2000000C et
E aura l’adresse 0x200000010.
Ensuite les adresses des variables seront placées dans la mémoire FLASH comme des
constantes parce qu’on ne peut pas mettre une adresse 32 bits à l’intérieur d’une instruction 32
bits. Le compilateur mettra l’adresse en FLASH avant ou après le code…
Enfin, il faut faire le code. L’assembleur choisira des registres pour effectuer les différentes
opérations. Les registres seront utilisés pour entreposer des constantes, des adresses ou des
résultats de calculs…
B
AdresseDeA
AdresseDeB
AdresseDeC
AdresseDeD
AdresseDeE
Debut
DC32 0x20000000
DC32 0x20000004
DC32 0x20000008
DC32 0x2000000C
DC32 0x20000010
Debut:
;A = 3
MOV
LDR
STR
;B = 3
MOV
LDR
STR
R0,#3
R1, AdresseDeA
R0,[R1]
;Compilé comme LDR R1, [PC, #16]
R0,#4
R1, AdresseDeB
R0,[R1]
;Compilé comme LDR R1, [PC, #24]
;C = A+B; sans optimisation, i.e. sans tenir compte des opérations précédentes
LDR R0, AdresseDeA
LDR R0,[R0]
LDR R1, AdresseDeB
LDR R1,[R1]
ADD R0,R0,R1
LDR R1, AdresseDeC
STR R0, [R1]
;D = A+B+C+5; sans optimisation, i.e. sans tenir compte des opérations précédentes
MOV R0,5
LDR R1,AdresseDeC
LDR R1.[R1]
ADD R0,R0,R1
LDR R1,AdresseDeB
LDR R1.[R1]
ADD R0,R0,R1
LDR R1,AdresseDeA
LDR R1.[R1]
ADD R0,R0,R1
LDR R1,AdresseDeD
STR R0, [R1]
Cours 9 : Les Piles et les Branchements
Q9.1 : Si L et M sont strictement positifs (non-signés), quelle instruction doit-on utiliser et
quel drapeau doit-on vérifier afin de déterminer si L est supérieur ou égal à M?
;On assume que L et M sont comparés (soustraction, différence) avant le branchement conditionnel
; « CMP L,M » où les valeurs de L et M seraient dans des registres
Si L et M sont positifs :
Cas
L>M
Effet de L-M sur le
drapeau C
C=0
Effet de L-M sur le
drapeau Z
Z=0
L=M
L<M
C=0
C=1
Z=1
Z=0
Effet de L-M sur le
drapeau V
Dépend des valeurs de L
et M
V=0
Dépend des valeurs de L
et M
Le drapeau C sera utilisé. L’instruction sera BCS (Branch Carry Set) ou BCC (Branch Carry Clear).
Q9.2 : Quelle est la différence entre l’instruction BX Reg et l’instruction B Offset?
Le X signifie eXchange. L’instruction BX Reg a deux effets : Reg = PC, PC = Reg.
Le X signifie eXchange. L’instruction B Offset a un seul effet : PC = PC + Offset + 8.
Q9.3 : À quoi sert le registre LR?
Il sert à faire le lien entre une fonction qui appelle une autre fonction : le registre LR
entrepose les adresses de retour (instruction BL).
Q9.4 : Le registre SP est-il incrémenté ou décrémenté lors d’un PUSH? Lors d’un POP?
Pourquoi varie-t-il toujours de 4?
Habituellement, SP est décrémenté lors d’un PUSH parce que la pile est habituellement
placée aux adresses supérieures de la RAM. Il varie de 4 parce que les mots et registres des
microprocesseurs ARM ont 32 bits.
Q9.5 : Écrivez une routine de calcul de la factoriel d’un nombre en assembleur ARM. Vous
routine doit posséder un paramètre d’entré (le nombre dont il faut calculer la factorielle) et
un paramètre de sortie (la factorielle du nombre). Passez les paramètres de la fonction par
registre.
Décidons d’abord que R0 contiendra le paramètre d’entrée et que R1 contiendra le résultat
(« R1 = R0! »). L’appel de la fonction se fera ainsi (Res = N!) :
LDR
LDR
LDR
BL
STR
R0,=N
R2,=Res
R0,[R0]
Facto
R1,[Res]
La fonction pourrait être codée ainsi, avec une boucle qui multiple 1 par i à chaque itération
pour i = 1 jusqu’à N :
Facto
PUSH {R3, R4, LR} ;Fonction propre!
MOV
R3, #1 ;R3 = i
MOV R1, #1 ;R1 = i!
CMP R0,#0 ;0! = 1
BEQ FinFacto
Boucle:
CMP R3,R0 ;i > N? Si oui, fin!
BHI FinFacto
;i > N? Si oui, fin!
MOV R4, R1
MUL R1, R4,R3
ADD R3,R3,#1
B Boucle
FinFacto
POP {R3, R4, LR}
BX
LR
Q9.6 : Comment fait-on pour passer des paramètres à une fonction?
Soit par registre (on assigne un registre à chaque paramètre), soit par la pile (les paramètres
d’entrée sont mis sur la pile avant le BL, et les paramètres de sortie sont pris sur la pile après
le retour de la fonction.
Q9.7 : Qu’est-ce qu’une fonction propre?
Une fonction qui ne change pas les registres en dehors de ceux utilisés pour le passage de
paramètres.
Q9.8 : Réécrivez la question 9.5 en passant les paramètres de la fonction par la pile.
L’appel de la function se fera ainsi:
LDR
LDR
LDR
PUSH
BL
POP
STR
R0,=N
R2,=Res
R0,[R0]
{R0} ;Le paramètre d’entrée, N, est mis sur la pile
Facto
{P1} ;Le paramètre de sortie est récupéré de sur la pile
R1,[Res]
Facto
PUSH {R0, R3, R4, LR}
;Fonction propre!
LDR R0, [SP, #16]
;Récupère N sur la pile (#16 -> R0, R3, R4, LR empilés)
MOV
R3, #1 ;R3 = i
MOV R1, #1 ;R1 = i!
CMP R0,#0 ;0! = 1
BEQ FinFacto
Boucle:
CMP R3,R0 ;i > N? Si oui, fin!
BHI FinFacto
;i > N? Si oui, fin!
MOV R4, R1
MUL R1, R4,R3
ADD R3,R3,#1
B Boucle
FinFacto
STR
POP
BX
R1, [SP, #16] ;Met N! sur la pile
{R0. R3, R4, LR}
LR
Q9.9 : Selon vous, pourquoi la pile fonctionne-t-elle du haut de la mémoire vers le bas,
plutôt que l’inverse qui semble plus intuitif?
La pile est habituellement placée aux adresses supérieures de la RAM et les variables aux
adresses inférieures de la RAM. Cette disposition diminue les risques de débordement de la
pile.
Q9.10 : Quelle est la différence entre une fonction et une macro?
Une fonction est un bout de code qui est appelé par un autre bout de code.
Une macro n’est pas « appelée ». Il s’agit de code que l’on recopie d’une place à l’autre du programme.
Q9.11 : Mathématiquement, effectuer c = a + (-b) revient à effectuer c = a – b. Cependant,
Effectuer c = a + (-b) n’a pas le même effet qu’effectuer c = a –b sur les drapeaux de
l’ALU. Quel(s) drapeau(x) rend cette affirmation vraie? Illustrez à l’aide d’un exemple.
Le drapeau Carry est une retenue lors d’une addition, mais un emprunt lors d’une soustraction. Par exemple,
additionner (-1) + (-1) donne une retenue, mais soustraire (-1) – 1 ne requiert pas d’emprunt.
Q9.12 : Combien d’accès à la mémoire sont effectués lorsque l’on appelle une fonction? En
d’autres mots, combien d’accès à la mémoire seront effectués pour lire et exécuter
l’instruction BL Mafonction?
BL Mafonction requiert un seul accès mémoire, pour lire l’instruction.
Q9.13 : Expliquez pourquoi la pile est presque systématiquement utilisée pour sauvegarder
les adresses de retours des fonctions?
Pour qu’une fonction puisse appeler une autre fonction.
Q9.14 : Dites quels sont les avantages et les inconvénients de passer les paramètres d’une
fonction par registre plutôt que par la pile. Dites également pourquoi passer les paramètres
par variables globales est une mauvaise pratique.
Passer les paramètres par registres est beaucoup plus rapide et plus simple que par la pile (on évite des accès à la
mémoire). Cependant, le nombre de registre est limité et il faudra mettre les registres sur la pile de toute façon si
la fonction appelle une autre fonction avec des paramètres passés par les mêmes registres. Bref, les registres sont
mieux, mais ils sont plus limités et n’offrent pas une solution universelle.
Les variables globales sont à éviter d’un point de vue maintenance et modularité. Par ailleurs, une fonction qui
utilise des variables globales n’est pas réentrante, elle peut difficilement être récursive, les variables globales
prennent de la mémoire qui pourraient être utilisée autrement…
Q9.15 : Qu’est qu’un débordement de pile (stack overflow)? Que se produit-il lorsque la
pile déborde?
Un débordement de pile survient lorsque le dessus de la pile dépasse la plage d’adresses réservée pour la pile
(parce que plus de données sont empilées que dépilées par exemple). Lors d’un débordement de pile, le contenu
de la mémoire après la pile est écrasé par les empilements: des variables changeront de valeur si la pile
débordent sur des variables ou des instructions imprévues seront exécutées si la pile déborde sur des instructions.
Q9.16 : Une fonction récursive (qui s’appelle elle-même) requiert souvent une grande pile.
Expliquez pourquoi.
À tous les appels de fonction, plusieurs octets de piles sont utilisés pour emmagasiner l’adresse de retour, passer
des paramètres, réserver de la mémoire pour les variables locales et/ou rendre la fonction propre. Cette mémoire
est libérée seulement lors du retour de la fonction. Or, les fonctions récursives s’appellent avant de terminer. Il y
aura donc plusieurs appels avant le premier retour de fonction qui libère de la mémoire de la pile.
Q9.17 : Écrivez une fonction qui vérifie si les parenthèses et les crochets d’une phrase
écrite en ASCII s’ouvrent et se ferment correctement. Voici quelques exigences reliées à
cette fonction :
-
-
La fonction reçoit en argument l’adresse de départ de la chaine de caractère
La chaine de caractère se termine lorsque le caractère NULL (0x00) est rencontré.
Lorsque la fonction rencontre une parenthèse ou un crochet qui ouvre, la fonction
doit empiler la valeur ascii rencontrée.
Lorsque la fonction rencontre une parenthèse ou un crochet qui ferme, la fonction
doit dépiler la version ouvrante du caractère rencontré. Si la pile est vide (à l’endroit
initial) ou si le caractère dépilé n’ouvre pas la parenthèse ou le crochet, la fonction
doit retourner une 0.
Lorsque la fonction rencontre un caractère non-null qui n’est pas une parenthèse
ou un crochet, la fonction continue.
À la fin de la chaine de caractère, le programme retourne 1 si la pile est vide. Il
retourne 0 s’il
Le passage de paramètre doit se faire par la pile, la fonction doit être propre et le
pointeur de pile doit revenir à son emplacement initial après l’appel de la fonction et
la lecture du résultat, même s’il y avait plus d’ouvertures que de fermetures.
Exemples :
“((allo]” retourne 0
“([(allo)])” retourne 1
“([allo)])” retourne 0
Q9.18 : Combien d’accès à la mémoire sont nécessaires afin de lire et d’exécuter
l’instruction PUSH {Rn}? L’instruction PUSH existe-t-elle vraiment ou est-elle compilée
comme une autre instruction?
L’instruction PUSH {R0} est lue en un seul coup d’horlorge et il faut un accès mémoire pour
l’exécuter, c’est-à-dire pour écrire la valeur de R0 sur la pile.
Cours 10 : Les Interruptions
Q10.1 : Qu’est-ce qu’une interruption? Quand cela se produit-il?
Une interruption est un évènement généralement imprévu qui interrompt la séquence normale d’exécution des
instructions par le microprocesseur.
Les interruptions se produisent quand un périphérique signale un évènement, quand une faute matérielle ou
logicielle survient ou quand le programmeur appelle une interruption.
Q10.2 : D’un point de vue logiciel, que fait généralement un microprocesseur lorsqu’il
détecte un signal d’interruption provenant d’un périphérique?
-
Le microprocesseur termine l’instruction (ou les instructions) en cours
Le microprocesseur vérifie si l’interruption peut être traitée en fonction de sa priorité et si elle est
permise.
Le microprocesseur sauvegarde l’adresse de retour et toute l’information nécessaire à la reprise normale
de l’exécution après le traitement de l’interruption.
Le microprocesseur détermine l’adresse de la routine à exécuter afin de traiter l’interruption.
Le microprocesseur fait un saut vers la routine qui traite l’interruption
Q10.3 : Pourquoi un ordinateur se sert-il de la pile lorsqu’une interruption se produit?
Pour sauvegarder l’adresse de retour de l’interruption et pour sauvegarder les autres
informations nécessaires à la poursuite des opérations, après le traitement de l’interruption.
Q10.4 : Qu’est-ce qu’une interruption masquée?
Il s’agit d’une interruption dont le traitement est repoussé ultérieurement parce qu’elle est
désactivée.
Q10.5 : À quoi sert la table des vecteurs d’interruption? Cette table est-elle en mémoire
vive, dans le microprocesseur, dans une mémoire non-volatile ou sur le disque dur?
La table des vecteurs d’interruption associe les interruptions à la routine qu’il faudra exécuter afin de les traiter.
Située dans la FLASH initialement (peut être déplacée en mémoire RAM), elle a pour index le numéro de
l’interruption et pour contenu l’adresse absolue de la routine qui traitera l’interruption.
Q10.6 : À quoi sert le contrôleur d’interruption programmable de votre ordinateur?
Le contrôleur d’interruption programmable est un circuit logique qui gère les interruptions : il reçoit et traite les
signaux d’interruptions provenant des périphériques d’un côté et, de l’autre côté, échange les signaux adéquats
avec le microprocesseur pour gérér les interruptions.
Q10.7 : Quelles sont les instructions communes à toutes les routines traitant les
interruptions (ISR, Interrupt Service Routine)?
Généralement, la routine d’interruption commence par sauvegarder sur la pile les registres qui seront utilisés
dans l’interruption.
Ensuite la routine d’interruption contiendra habituellement des instructions gérant l’interruption elle-même
(exemple : remettre à 0 le drapeau signalant l’interruption pour que l’interruption puisse se produire de nouveau).
La routine d’interruption contiendra aussi très souvent des instructions qui lui demanderont d’accéder au
périphérique ayant causé l’interruption lorsqu’il s’agit d’une interruption matérielle.
Puis, la routine d’interruption rechargera les registres sauvegardés sur la pile au début de l’interruption
Enfin, une instruction de retour à la fin de la routine d’interruption dépilera l’adresse de retour et les autres
informations nécessaires à la reprise de l’exécution après la routine d’interruption.
Q10.8 : Qu’est-ce qu’une exception? Pourquoi les exceptions ont-elles une priorité plus
grande que les interruptions matérielles et les interruptions logicielles?
Une exception est un évènement anormal ou imprévu survenant lors de l’exécution du code. Habituellement, une
exception rend impossible la lecture ou l’exécution de l’instruction en cours (exemple : division par 0). Les
exceptions ont des priorités plus grande que les interruptions parce qu’il faut les traiter si elles se produisent lors
de l’exécution d’une interruption…
Q10.9 : Pourquoi utilise-t-on des interruptions logicielles plutôt que des appels de fonction
pour appeler des routines du système d’exploitation afin d’accéder aux périphériques?
-
Pour permettre au système d’exploitation de changer facilement l’adresse des routines permettant
d’accéder au matériel, susceptible de changer d’un ordinateur à l’autre.
Pour fournir une interface conviviale entre les fonctions du système d’exploitation qui peuvent changer
de place et les applications des programmeurs.
Q10.10 : Quel est l’effet d’une interruption sur le registre PC?
PC prend une nouvelle valeur fournie à partie du numéro de l’interruption et de la table des vecteurs
d’interruptions
Q10.11 : Pour le cœur ARM, où est sauvegardée l’adresse de retour qui sera utilisée
lorsque la routine traitant l’interruption sera terminée?
Sur la pile
Q10.12 : Classez les interruptions suivantes de la plus prioritaire à la moins prioritaire :
RESET, NMI, Exception, Interruption Logicielle, Interruption Matérielle.
RESET, NMI, Exception, Interruption Logicielle, Interruption Matérielle
Q10.13 : À quelles adresses de la mémoire retrouverons-nous l’adresse de la routine
d’interruption 9h (assumez un cœur Cortex M3).
L’adresse sera 9*4 = 36
Q10.14 : Qu’est qu’un détournement d’interruption?
Une modification au comportement d’une interruption. En fait, un détournement d’interruption se divise en deux
parties : le vecteur de l’interruption est changé dans la table des vecteurs d’interruption et la nouvelle
interruption appelle l’ancienne interruption après avoir effectué une tâche additionnelle.
Q10.15 : Décrivez ce qui ce passe, au niveau des lignes dédiées à le gestion des
interruptions, lorsqu’un usager appuie sur une touche du clavier?
Le contrôleur de clavier active un signal d’interruption qui sera reçu par le contrôleur
d’interruption. Ensuite, en fonction des autres interruptions et en fonction de ses paramètres
d’opération, le contrôleur d’interruption génèrera un signal d’interruption au microprocesseur.
Ce signal sur vu par le microprocesseur qui entamera le traitement de l’interruption après
échange d’information et de signaux avec le contrôleur d’interruption.
Q10.16 : Y-a-t-il une différence entre l’instruction permettant de revenir d’une interruption
et celle permettant de revenir d’une fonction? Y-a-t-il une différence de comportement du
microprocesseur dans ces deux cas?
Il n’y a pas de différence entre les deux instructions pour le processeur ARM : dans les deux
cas, BX LR est utilisée. Cependant, LR contient l’adresse de retour lorsqu’on revient d’une
fonction et LR contient une valeur égale à 0xFFFFFFFX lorsqu’on veut revenir d’une
interruption.
Quand LR n’est pas 0xFFFFFFFX (retour de fonction), PC prends la valeur de LR et le retour
est fait.
Quand LR vaut 0xFFFFFFFX (retour d’interruption), le microprocesseur dépile l’adresse de
retour (PC = Mem[SP, #X] et plusieurs autres informations (drapeaux, LR et certains
registres).
Q10.17 : Y a-t-il un contrôleur d’interruption sur les cartes mères récentes?
Oui et non : le contrôleur d’interruption est présent, mais il est intégré dans le
microprocesseur ou le chipset.
Cours 11 : Les Directives Assembleurs
Q11.1 : Qu’est-ce qu’une directive d’assembleur?
Une directive d’assembleur est une commande donnée à l’assembleur qui aura un impact sur l’organisation du
code. Une directive ne produit pas de code compilé.
Q11.2 : À quoi servent les directives Include, Public et Extern?
Écrire des programmes sur plusieurs fichiers…
- Include “MonFichier” est remplacé par le contenu de MonFichier.
- Public indique que la variable peut être utilisée dans un autre fichier
- Extern indique que la variable est définie et publique dans un autre fichier
Q11.3 : Quelle est la différence entre une macro et une procédure? Quelle est la différence
entre une constante et une variable?
Lors de l’assemblage, une macro ou une constante est remplacée par du code ou par une valeur (celle de la
constante!!!) alors qu’une fonction est appelée et une variable est remplacée par une adresse.
Q11.4 : Dans quelles circonstances est-il recommandé d’utiliser des if, ifdef ou else?
Autrement dit, qu’elle est l’utilité de ces directives? Donnez des exemples.
Ces directives servent lorsque l’environnement d’un code change. Par exemple, elles peuvent servir à :
-
Changer le code si deux microprocesseurs différents avec des jeux d’instructions semblables sont
employés
Changer les délais d’un programme en fonction d’horloge du microprocesseur
Adapter un programme générique à certains besoins précis d’un client
Déterminer qu’elle version d’une fonction est implémentée si deux versions sont supportées
Etc.
Q11.5 : À quoi sert la directive segment?
Elle sert à placer le code ou les variables à des endroits précis de la mémoire.
Q11.6 : Déterminez si les lignes de textes suivantes sont des directives d’assembleur ou des
instructions:
a) MaVar
DS32 1
b) MOV R0,R1
c) ORG 100h
d) B etiquette
e) etiquette :
Directives : a, c, e
Instructions : b, d
Téléchargement