TD4
TD N°04_correction
Exercice
Soit un exemple de processeur ARM qui ne fonctionne qu’en mode Thumb dont un extrait de
son ISA est donné par le tableau suivant :
Instruction Action (C_style coding) Codage en binaire (16 bits)
ADDS Rds, #imm8 Rds = Rds + ZeroExtend(imm8,32) 0 0 1 1 0 Rds Imm8
Mettre à jour APSR (NZCV)
ADDS Rd, Rs1,Rs2 Rd=Rs1+Rs2 0 0 0 1 1 0 0 Rs2 Rs1 Rd
Mettre à jour APSR (NZCV)
SUBS Rds, #imm8 Rds = Rds - ZeroExtend(imm8,32) 0 0 1 1 1 Rds Imm8
Mettre à jour APSR (NZCV)
SUBS Rd, Rs1,Rs2 Rd=Rs1- Rs2 0 0 0 1 1 0 1 Rs2 Rs1 Rd
Mettre à jour APSR (NZCV)
CMP Rs, #imm8 Rs - ZeroExtend(imm8,32) 0 0 1 01 1 Rs Imm8
Mettre à jour APSR (NZCV)
CMP Rs1,Rs2 Rs1 – Rs2 0 1 0 0 0 0 1 0 1 0 Rs2 Rs1
Mettre à jour APSR (NZCV)
ANDS Rds, Rs Rds=Rds & Rs 0 1 0 0 0 0 0 0 0 0 Rs Rds
Mettre à jour APSR (NZ)
ORRS Rds, Rs Rds=Rds | Rs 0 1 0 0 0 0 1 1 0 0 Rs Rds
Mettre à jour APSR (NZ)
EORS Rds, Rs Rds=Rds ^Rs 0 1 0 0 0 0 0 0 0 1 Rs Rds
Mettre à jour APSR (NZ)
LDR Rt,[Ra,{#imm5}] Rt=MEM[Ra+ imm32] 0 1 1 0 1 Imm5 Ra Rt
LDR r1, [r0] imm32= ZeroExtend(imm5 :’00’,32)
STR Rt,[Ra, ,{#imm5}] MEM[Ra+ imm32]=Rt 0 1 1 0 0 Imm5 Ra Rt
imm32= ZeroExtend(imm5 :’00’,32)
Rs, Rs1, Rs2: numéros des registres source
Rd : numéro d’un registre destination
Rds : numéro d’un registre qui est à la fois source et destination
Rt : numéro d’un registre data
Ra : numéro d’un registre adresse
imm5, imm8, imm32 : valeurs immédiates avec chiffre désignant le nombre de bits de codage
# : Symbole obligatoire précédent aux valeurs immédiates en assembleur ARM
{} : Pour dire que c’est facultatif
D’après cet extrait :
1) Est ce que ce processeur appartient à la famille RISC ou CISC ? Justifier.
RISC car les seules instructions qui accèdent à la mémoire sont LDR (de type Load) et
STR (de type store)
2) Combien le processeur contient au maximum de registres internes ?
8 registres car on identifie les champs registres dans toutes les instructions avec 3 bits
2019-2020
TD4
3) Commenter et coder en hexadécimal les instructions suivantes :
LDR r1, [r0] ; charger dans r1 les 4 octets (mot) de la mémoire à partir de
l’adresse ;contenue dans r0
SUBS r3, r2, r1 ; soustraire le contenu de r1 du contenu de r2 et charger le résultat dans r3
; Selon le résultat on fait la MAJ des bits NZVC du PSR
EORS r4, r2 ; faire le XOR binaire du contenu de r2 et du contenu de r4 et charger le
résultat ;dans r4
; Selon le résultat on fait la MAJ des bits NZ du PSR
STR r4, [r0, #10] ; charger le contenu de r4 dans 4 cases mémoire successives à partir
de ;l’adresse donnée par le contenu de r0 décalée de 10 positions
En binaire en hexadécimal
LDR r1, [r0] 01101 00000 000 001 6801
SUBS r3, r2, r1 0001101 001 010 011 1A53
EORS r4, r2 0100000001 010 100 4054
STR r4, [r0, #10] 01100 01010 000 100 6284
4) Sachant que la cartographie mémoire est la même que le Cortex M4,
a) expliquer pourquoi on peut enregistrer l’extrait de programme précédent à
partir de l’adresse 0x00001008 ?
L’adresse de début 0x00001008 appartient à la marge des valeurs des adresses de la mémoire
Flash (CODE) entre 0x00000000 et 0x1FFFFFFF
Notre programme comporte 2×4 Octets donc nécessite 8 cases mémoire donc l’adresse de fin est
0000 1008 + 0000 0008 -1 = 0000 100F qui appartient aussi à le même marge des adresses.
b) Schématiser l’enregistrement l’extrait de programme précédent dans la
mémoire à partir de cette adresse (contenu écrit en hexadécimal) sachant que le
processeur est LE.
2019-2020
TD4
Adresse mémoire (en Contenu de la case (en hexa)
hexa)
00001008 01
00001009 68
0000100A 53
0000100B 1A
0000100C 54
0000100D 40
0000100E 84
0000100F 62
5) Exécuter pas à pas l’extrait de programme sachant que le contenu de certains registres
est le suivant :
r0 : 0x30000001
r2 : 0x00AF0001
r4 : 0x0000FFFF
Et que le contenu de la mémoire à :
adresse 0x30000001 : 00
adresse 0x30000002 : 3B
adresse 0x30000003 : 00
adresse 0x30000004 : F0
Au début :
r0 Mémoire SRAM (DATA)
30000001
r2 adresse contenu
30000001 00
00AF0001 30000002 3B
r4 30000003 00
30000004 F0
0000FFFF
LDR r1, [r0]
r1
2019-2020
TD4
F0003B00
SUBS r3, r2, r1
00AF0001 – F0003B00 :
0000 0000 1010 1111 0000 0000 0000 0001
1111 0000 0000 0000 0011 1011 0000 0000
Ce qui revient en complément à 2:
0000 0000 1010 1111 0000 0000 0000 0001
0000 1111 1111 1111 1100 0101 0000 0000
0001 0000 1010 1110 1100 0101 0000 0001
= 10AE C501
r3
10AEC501
Dans PSR: N=0 Z=0 C=0 V=0
EORS r4, r2
00AF0001⊕0000FFFF : 0000 0000 1010 1111 0000 0000 0000 0001
⊕ 0000 0000 0000 0000 1111 1111 1111 1111
= 0000 0000 1010 1111 1111 1111 1111 1110
= 00AFFFFE
r4
00AFFFFE
2019-2020
TD4
Dans PSR: N=0 Z=0
STR r4, [r0, #10]
r0+10 = 30000001+ 0000000A = 3000000B
Mémoire SRAM (DATA)
adresse contenu
r4 30000001 00
30000002 3B
00AFFFFE 30000003 00
30000004 F0
...
3000000B FE
3000000C FF
3000000D AF
3000000E 00
2019-2020