• Aucun résultat trouvé

Systèmes à Microprocesseurs

N/A
N/A
Protected

Academic year: 2022

Partager "Systèmes à Microprocesseurs"

Copied!
32
0
0

Texte intégral

(1)

Systèmes à Microprocesseurs

Cycle Ingénieur Troisième Année

Sébastien Bilavarn

Cycle Ingénieur Troisième Année

Systèmes à Microprocesseurs

Cycle Ingénieur Troisième Année

Sébastien Bilavarn

Cycle Ingénieur Troisième Année

(2)

 Ch1 – Représentation de l’information

 Ch2 – ARM Instruction Set Architecture

 Ch3 – Accès aux données

 Ch4 – Programmation structurée

 Ch5 – Cycle d’exécution

 Ch5 – Cycle d’exécution

 Ch6 – Codage binaire

 Ch7 – Microcontrôleur ARM Cortex

Plan

Représentation de l’information ARM Instruction Set Architecture Accès aux données

Programmation structurée Cycle d’exécution

Cycle d’exécution Codage binaire

Microcontrôleur ARM Cortex-M

(3)

La représentation en mémoire

 Codage binaire des instructions

 Exécution séquentielle et rupture de

 Instructions de branchement relatif

La représentation en mémoire

Codage binaire des instructions

 Programme Exécution séquentielle et rupture de

séquence

Instructions de branchement relatif

(4)

Codage binaire d’une instruction

 Une instruction représente une opération élémentaire du processeur

L’ensemble des instructions disponibles s’appelle le jeu d’instruction

Chaque instruction définit un traitement précis opéré par la machine

 En assembleur, l’instruction s’écrit sous la forme d’un mot-clé suivi de ses opérandes.

mot-clé suivi de ses opérandes.

On utilise des mnémoniques pour des raisons de commodité (faciliter l’écriture de programmes assembleur)

Le processus d’assemblage transforme ensuite la séquence de mnémoniques instructions en séquence de codes binaires

interprétable par la machine.

 Pour le processeur, une instruction est codée par un mot de 32 bits (codage binaire).

Chaque du bit de l’instruction 32 bit a un rôle précis

Codage binaire d’une instruction

Une instruction représente une opération élémentaire

L’ensemble des instructions disponibles s’appelle le jeu d’instruction Chaque instruction définit un traitement précis opéré par la machine

En assembleur, l’instruction s’écrit sous la forme d’un clé suivi de ses opérandes.

clé suivi de ses opérandes.

On utilise des mnémoniques pour des raisons de commodité (faciliter l’écriture de programmes assembleur)

Le processus d’assemblage transforme ensuite la séquence de mnémoniques instructions en séquence de codes binaires

interprétable par la machine.

Pour le processeur, une instruction est codée par un mot de 32 bits (codage binaire).

Chaque du bit de l’instruction 32 bit a un rôle précis

(5)

Codage binaire d’une instruction

 Une instruction de traitement est composée des champs

Registre résultat

Rd: R0…R15

Premier opérande (toujours un registre)

Rn: R0…R15

Deuxième opérande

Rm: R0…R15

Rm: R0…R15

Rm: R0…r15 avec décalage (log/arith/rot, quantité)

Une valeur immédiate (constante)

Opération à réaliser par l’UAL

Opcode

Affecte le registre d’état CPSR

Suffixe S

Condition

Exécution conditionnelle (EQ, LE, etc.)

Codage binaire d’une instruction

Une instruction de traitement est composée des champs

Premier opérande (toujours un registre)

Rm: R0…r15 avec décalage (log/arith/rot, quantité) Une valeur immédiate (constante)

Opération à réaliser par l’UAL Affecte le registre d’état CPSR

Exécution conditionnelle (EQ, LE, etc.)

(6)

 Instructions de traitement (1)

Cond: l’instruction est exécutée si le registre d’état CPSR vérifie la condition spécifiée

cond 0 0 # opcode S Rn 19 20 21 24

25 26 27 28 31

CPSR vérifie la condition spécifiée

Asm Cond

EQ 0000

NE 0001

CS/HS 0010

CC/LO 0011

MI 0100

PL 0101

Asm VS VC HI LS GE LT

Codage binaire

Instructions de traitement (1)

: l’instruction est exécutée si le registre d’état CPSR vérifie la condition spécifiée

Rn Rd operand 2

0 11

12 15 16

CPSR vérifie la condition spécifiée

Asm Cond

0110 0111 1000 1001 1010 1011

Asm Cond

GT 1100

LE 1101

AL 1110

NV 1111

(7)

 Instructions de traitement (2)

S = 1 : affecte CPSR

Opcode : code de l’opération à effectuer

cond 0 0 # opcode S Rn 19 20 21 24

25 26 27 28 31

Opcode : code de l’opération à effectuer

Asm Opcode

AND 0000

EOR 0001

SUB 0010

RSB 0011

ADD 0100

ADC 0101

Asm SBC RSC TST TEQ CMP CMN

Codage binaire

Instructions de traitement (2)

code de l’opération à effectuer

Rn Rd operand 2

0 11

12 15 16

code de l’opération à effectuer

Asm Opcode

SBC 0110

RSC 0111

TST 1000

TEQ 1001

CMP 1010

CMN 1011

Asm Opcode

ORR 1100

MOV 1101

BIC 1110

MVN 1111

(8)

 Instructions de traitement (3)

Rd → numéro du registre de destinations

4 bits pour sélection parmi les 16 registres possibles

cond 0 0 # opcode S Rn 19 20 21 24

25 26 27 28 31

4 bits pour sélection parmi les 16 registres possibles

Rn → numéro du registre qui sert de premier opérande

4 bits pour sélection parmi les 16 registres possibles

operand2 → relié à l’entrée B

possibilité de rotation/décalage

Codage binaire

Instructions de traitement (3)

numéro du registre de destinations

4 bits pour sélection parmi les 16 registres possibles

Rn Rd operand 2

0 11

12 15 16

4 bits pour sélection parmi les 16 registres possibles

→ numéro du registre qui sert de premier

4 bits pour sélection parmi les 16 registres possibles

→ relié à l’entrée B

possibilité de rotation/décalage

(9)

 Instructions de traitement (4)

cond 0 0 # opcode S Rn 19 20 21 24

25 26 27 28 31

 Si le bit # est à 1, operand2

1

 Si le bit # est à 1, operand2 sur 32 bits.

Une instruction est codée sur 32 bits, il n’est donc pas possible de coder n’importe quelle valeur littérale 32 bits.

Cette valeur est construite par rotation vers la droite d’une valeur sur 8 bits.

Codage binaire

Instructions de traitement (4)

Rn Rd operand 2

0 11

12 15 16

#rot 8-bit immediate 0 11 8 7

operand2 est une valeur littérale operand2 est une valeur littérale

Une instruction est codée sur 32 bits, il n’est donc pas possible de coder n’importe quelle valeur littérale 32 bits.

Cette valeur est construite par rotation vers la droite d’une

(10)

 Instructions de traitement (5)

cond 0 0 # opcode S Rn 19 20 21 24

25 26 27 28 31

 Cette valeur est construite par rotation vers la droite d’une valeur sur 8 bits.

1

d’une valeur sur 8 bits.

 Le nombre de rotations (

code pas le bit de poids faible.

 Exemple 1: ADD r5, r4, #0x5C0

(5C0) hex = (0…0 0101 11

8-bit immediate = (17) hex

(#rot) = (26) dec = (11010)

Codage binaire

Instructions de traitement (5)

Rn Rd operand 2

0 11

12 15 16

#rot 8-bit immediate 0 11 8 7

Cette valeur est construite par rotation vers la droite d’une valeur sur 8 bits.

d’une valeur sur 8 bits.

Le nombre de rotations (#rot) doit être pair: on ne code pas le bit de poids faible.

Exemple 1: ADD r5, r4, #0x5C0

101 1100 0000) bin

hex = (0001 0111) bin

= (11010) bin

(11)

 Exemple 2: codage de la valeur 32768

(32768) dec = (0…0 0000 1000

8-bit immediate = (8) dec

(#rot) = (20) dec = (10100)

(32768) dec = (0…0 1010

Codage binaire

Exemple 2: codage de la valeur 32768

0000 1000 0000 0000 0000) bin

dec = (0000 1000) bin

= (10100) bin

= (0…0 1010 0000 1000) cod

(12)

 Instructions de traitement (6)

Asm Sh

00 rien

LSL #n 00

- 0 à 31

0 n

n #shift

cond 0 0 # opcode S Rn 19 20 21 24

25 26 27 28 31

0

 Si le bit # est à 0, operand2

lequel on applique (ou non) une rotation/décalage

Le nombre de bits de décalage est soit

Un litéral #shift (5 bits 32 valeurs)

Le contenu d’un registre Rs (4 bits pour sélection parmi R0…R15)

LSR #n ASR #n

01 ROR #n

10 RRX

11

LSL #n 00

11 1 à 32

1 à 32 1 à 31

- 0 à 31

0 n

n

n si n<32, 0 si n=32 n si n<31, 0 si n=32

Codage binaire

Instructions de traitement (6)

Rn Rd operand 2

0 11

12 15 16

#shift Rm

0

11 7

0 Sh

5 6 4 3

Rs Rm

0

11 7

1 Sh

5 6 4 3 0

8

operand2 est un registre (Rm) sur lequel on applique (ou non) une rotation/décalage

Le nombre de bits de décalage est soit

Un litéral #shift (5 bits 32 valeurs)

Le contenu d’un registre Rs (4 bits pour sélection parmi R0…R15)

n si n<32, 0 si n=32

n si n<31, 0 si n=32

(13)

Codage binaire d’une instruction

 Instructions de transfert

Lecture/écriture

Données accédées

Mots, demi-mots, octets

Signées/non signées

Mode d’accès (pré/post indexé, +/ Mode d’accès (pré/post indexé, +/

Transfert simple/multiple

Registre source/destination, liste de registres

Registre de base

Offset

Condition

Exécution conditionnelle d’un transfert

Codage binaire d’une instruction

Mode d’accès (pré/post indexé, +/- offset, write back) Mode d’accès (pré/post indexé, +/- offset, write back) Registre source/destination, liste de registres

Exécution conditionnelle d’un transfert

(14)

 Instructions de transfert de mots ou d’octets non signés (LDR, STR, LDRB, STRB)

P : pre/post index

1 pré-indexé, 0 post-indexé

cond 0 1 # L Rn

16 19

20 21 25 24

26 27 28 31

P U B W 23 22

1 pré-indexé, 0 post-indexé

U : up/down

1 + offset, 0 -offset

B : byte/word

M1 accès 8 bits, 0 accès 32 bits

W : write-back

Si P=1, W=1 adressage pré

L : load/store

Codage binaire

Instructions de transfert de mots ou d’octets non- signés (LDR, STR, LDRB, STRB)

indexé

Rd offset

0 11

12 15 16

indexé

M1 accès 8 bits, 0 accès 32 bits

Si P=1, W=1 adressage pré-indexé automatique

(15)

 Instructions de transfert de mots ou d’octets non signés (LDR, STR, LDRB, STRB)

cond 0 1 # L Rn

19 20 21 25 24

26 27 28 31

P U B W 23 22

Rd → registre source (si L=0, store) ou destination (si L=1, load)

Rn → registre de base

Codage binaire

Instructions de transfert de mots ou d’octets non- signés (LDR, STR, LDRB, STRB)

Rn Rd offset

0 11

12 15 16

registre source (si L=0, store) ou destination (si

→ registre de base

(16)

 Instructions de transfert de mots ou d’octets non signés (LDR, STR, LDRB, STRB)

0

cond 0 1 # L Rn

19 20 21 25 24

26 27 28 31

P U B W 23 22

 Offset: soit un littéral non signé sur 12 bits, soit un registre d’index (Rm) éventuellement décalé sur un nombre constant de bits (

1

Codage binaire

Instructions de transfert de mots ou d’octets non- signés (LDR, STR, LDRB, STRB)

12-bit immediate

0 11

Rn Rd offset

0 11

12 15 16

Offset: soit un littéral non signé sur 12 bits, soit un ) éventuellement décalé sur un nombre constant de bits (#shift)

#shift Rm

0

11 7

0 Sh

5 6 4 3

(17)

Instructions de transfert de demi

(LDRH, STRH, LDRSH, STRSH, LDRSB, STRSB)

0

cond 0 0 0 L Rn

19 20 21 25 24

26 27 28 31

P U # W 23 22

 S : signed

1 nombre signé, 0 non signé

 H : half-word/byte

1 accès 16 bits, 0 accès 8 bits

 Offset : soit un litéral sur 8 bits ( d’index (Rm) non décalé

1

Codage binaire

Instructions de transfert de demi-mots ou d’octets signés (LDRH, STRH, LDRSH, STRSH, LDRSB, STRSB)

Imm[7:4]

Rn Rd offsetH

0 11

12 15 16

offsetL 1 S H 1

5 4 6

7 3

8

Imm[3:0]

1 nombre signé, 0 non signé

1 accès 16 bits, 0 accès 8 bits

soit un litéral sur 8 bits (Imm), soit un registre ) non décalé

0000 Rm

(18)

 Instructions de transfert multiple (LDM STMmode)

cond 1 0 0 L Rn

16 19

20 21 25 24

26 27 28 31

P U S W 23 22

mode U

DA 0

P 0

 Chaque bit de reglist contrôle le transfert d’un registre: si reglist[i] = 1, alors le registre

transféré

DA 0

DB 0

IA 1

IB 1

0 1 0 1

Codage binaire

Instructions de transfert multiple (LDMmode,

reglist

0 15

16

P 0

Chaque bit de reglist contrôle le transfert d’un registre: si reglist[i] = 1, alors le registre ri sera

0

1

0

1

(19)

 Pour nous, un programme est une séquence

d’instructions disposées l’une après l’autre dans un fichier texte et repérées (éventuellement) par des labels

 Pour le processeur, un programme est

Une succession de mots de 32 bits

Une succession de mots de 32 bits

… conformes à la convention de codage des instructions pour le processeur considéré

… rangés en mémoire à des adresses contigües

Une instruction est repérée par son adresse mémoire

Programme

Pour nous, un programme est une séquence

d’instructions disposées l’une après l’autre dans un fichier texte et repérées (éventuellement) par des Pour le processeur, un programme est

Une succession de mots de 32 bits Une succession de mots de 32 bits

… conformes à la convention de codage des instructions pour le processeur considéré

… rangés en mémoire à des adresses contigües

Une instruction est repérée par son adresse mémoire

(20)

 Exemple: programme assembleur ARM implanté à l’adresse 0x8000 pour une organisation little

MOV r4, #1 MOV r4, #1

STR r4, [r6], #4 STR r4, [r6], #4 STR r4, [r6]

STR r4, [r6]

STR r4, [r6, #4]

STR r4, [r6, #4]

MOV r7, #1 MOV r7, #1 MOV r9, #5 MOV r9, #5 MOV r8, r7 MOV r8, r7 LDR r4, [r6]

LDR r4, [r6]

LDR r5, [r6, #4]!

LDR r5, [r6, #4]!

ADD r4, r4, r5 ADD r4, r4, r5

Programme

Exemple: programme assembleur ARM implanté à l’adresse 0x8000 pour une organisation little-endian

0x8000 01 40 A0 E3 0x8004 04 40 86 E4 0x8008 00 40 86 E5

Adresses croissantes

0x800C 04 40 86 E5 0x8010 01 70 A0 E3 0x8014 05 90 A0 E3 0x8018 07 80 A0 E1 0x801C 00 40 96 E5 0x8020 04 50 B6 E5 0x8024 05 40 84 E0

Poids faible

Poids

fort

(21)

Le "compteur programme"

Registre r15 également appelé PC (Program Counter)

Contient l’adresse de la prochaine instruction à lire en mémoire

Évolue de 4 en 4 au fil de l’exécution

En avance de deux instructions sur l’instruction suivante

MOV r4, #1 MOV r4, #1

STR r4, [r6], #4 STR r4, [r6], #4 STR r4, [r6], #4 STR r4, [r6], #4 STR r4, [r6]

STR r4, [r6]

STR r4, [r6, #4]

STR r4, [r6, #4]

MOV r7, #1 MOV r9, #5 MOV r9, #5 MOV r8, r7 LDR r4, [r6]

LDR r4, [r6]

LDR r5, [r6, #4]!

LDR r5, [r6, #4]!

ADD r4, r4, r5 ADD r4, r4, r5

Instruction en cours d’exécution

Instruction lue en mémoire

Programme

Registre r15 également appelé PC (Program Counter)

Contient l’adresse de la prochaine instruction à lire en mémoire Évolue de 4 en 4 au fil de l’exécution

En avance de deux instructions sur l’instruction suivante

0x8000 01 40 A0 E3 0x8004 04 40 86 E4 0x8004 04 40 86 E4 0x8008 00 40 86 E5 0x800C 04 40 86 E5 0x8010 01 70 A0 E3 0x8014 05 90 A0 E3 0x8018 07 80 A0 E1 0x801C 00 40 96 E5 0x8020 04 50 B6 E5 0x8024 05 40 84 E0 Instruction en cours

d’exécution

Instruction lue en mémoire

0x8018

PC (r15)

(22)

 Exécution séquentielle et rupture de séquence

L’incrémentation automatique du registre PC permet

d’exécuter les instructions séquentiellement (l’une après l’autre)

Nécessité d’instructions de

Pour exécuter conditionnellement des blocs d’instruction (traduction des structures if et switch

des structures if et switch

Pour exécuter un bloc d’instructions en boucle

Méthode brutale: agir directement sur le registre PC

MOV pc, …

ADD/SUB pc, …

Programme

Exécution séquentielle et rupture de séquence

L’incrémentation automatique du registre PC permet

d’exécuter les instructions séquentiellement (l’une après Nécessité d’instructions de "rupture de séquence"

Pour exécuter conditionnellement des blocs d’instruction (traduction switch en langage C)

switch en langage C)

Pour exécuter un bloc d’instructions en boucle

Méthode brutale: agir directement sur le registre PC

(23)

Exécution séquentielle et rupture de

 Exemple: traduction d’une boucle

0x8000

0x8000 MOV MOV r4, #0 r4, #0 0x8004

0x8004 MOV MOV r5, #0 r5, #0

0x8008 ADD ADD r4, r4, r5 r4, r4, r5 0x800C

0x800C ADD ADD r5, r5, #1 r5, r5, #1 0x8010

0x8010 CMP CMP r5, #5 r5, #5 0x8014

0x8014 MOVLT pc, 0x8008

Branchement absolu: on connaît l’adresse de l’instruction destination

 Inconvénients:

Le programme doit être placé à une adresse fixe connue

Programme difficile à modifier (insertion d’instructions)

Exécution séquentielle et rupture de séquence

Exemple: traduction d’une boucle for

r4, #0

r4, #0 @ @ tmp tmp=0 =0 r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5, #5 r5, #5

pc, 0x8008 @ i<5 : réitérer @ i<5 : réitérer

: on connaît l’adresse de l’instruction destination

Le programme doit être placé à une adresse fixe connue

Programme difficile à modifier (insertion d’instructions)

(24)

Exécution séquentielle et rupture de

 Exemple: traduction d’une boucle

0x8000

0x8000 MOV MOV r4, #0 r4, #0 0x8004

0x8004 MOV MOV r5, #0 r5, #0

0x8008 ADD ADD r4, r4, r5 r4, r4, r5 0x800C

0x800C ADD ADD r5, r5, #1 r5, r5, #1 0x8010

0x8010 CMP CMP r5, #5 r5, #5 0x8014

0x8014 MOVLT pc, 0x8008

Branchement absolu: on connaît l’adresse de l’instruction destination

 Inconvénients:

Le programme doit être placé à une adresse fixe connue

Programme difficile à modifier (insertion d’instructions)

Limitation sur les valeurs littérales dans l’instruction MOV

Exécution séquentielle et rupture de séquence

Exemple: traduction d’une boucle for

r4, #0

r4, #0 @ @ tmp tmp=0 =0 r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5, #5 r5, #5

pc, 0x8008 @ i<5 : réitérer @ i<5 : réitérer

: on connaît l’adresse de l’instruction destination

Le programme doit être placé à une adresse fixe connue

Programme difficile à modifier (insertion d’instructions)

Limitation sur les valeurs littérales dans l’instruction MOV

(25)

Exécution séquentielle et rupture de

 Exemple: traduction d’une boucle

0x8000

0x8000 MOV MOV r4, #0 r4, #0 0x8004

0x8004 MOV MOV r5, #0 r5, #0

0x8008 ADD ADD r4, r4, r5 r4, r4, r5 0x800C

0x800C ADD ADD r5, r5, #1 r5, r5, #1 0x8010

0x8010 CMP CMP r5, #5 r5, #5 0x8010

0x8010 CMP CMP r5, #5 r5, #5 0x8014

0x8014 SUBLT pc, pc, #0x14 0x8018

0x8018 … … 0x801C … …

Branchement relatif: on connait la distance entre la valeur courante de PC et l’instruction destination

 Inconvénient: insertion d’instructions

(14)

hex

Exécution séquentielle et rupture de séquence

Exemple: traduction d’une boucle for

r4, #0

r4, #0 @ @ tmp tmp=0 =0 r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5, #5 r5, #5 r5, #5 r5, #5

pc, pc, #0x14 @ i<5 : réitérer @ i<5 : réitérer

: on connait la distance entre la valeur courante de PC et l’instruction destination

Inconvénient: insertion d’instructions

(26)

Cas de l’instruction BL

Exemple:

traduction d’un appel de sous- programme

@ Fonction somme: n dans r1, résultat dans r0

@ Fonction somme: n dans r1, résultat dans r0 0x8000 MOV MOV

0x8004

0x8004 MOV MOV 0x8008 ADD ADD 0x800C

0x800C ADD ADD 0x8010

0x8010 CMP CMP 0x8014

0x8014 SUBLT

Sans

instruction BL:

comment revenir d’un appel de sous- programme?

0x8018

0x8018 MOV MOV 0x801C

0x801C ???

@ programme principal

@ programme principal 0x8020

0x8020 MOV MOV 0x8024

0x8024 MOV

0x8028

0x8028 MOV MOV 0x802C

0x802C MOV MOV 0x8030

0x8030 MOV

0x8034

0x8034 MOV MOV

Cas de l’instruction BL

@ Fonction somme: n dans r1, résultat dans r0

@ Fonction somme: n dans r1, résultat dans r0 r4, #0

r4, #0 @ @ tmp tmp=0 =0 r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5, r1 r5, r1

pc, pc, #0x14 @ i<n : réitérer @ i<n : réitérer r0, r4

r0, r4 @ résultat = @ résultat = tmp tmp

@ return

@ programme principal

@ programme principal r1, #5

r1, #5 @ n = 5 @ n = 5

pc, 0x8000 @ appel à somme @ appel à somme r6, r0

r6, r0 @ r6 = résultat @ r6 = résultat r1, #10

r1, #10 @ n = 10 @ n = 10

pc, 0x8000 @ appel à somme @ appel à somme r7, r0

r7, r0 @ r7 = résultat @ r7 = résultat

(27)

Cas de l’instruction BL

@ Fonction somme: n dans r1, résultat dans r0

@ Fonction somme: n dans r1, résultat dans r0 0x8000 MOV MOV

0x8004

0x8004 MOV MOV 0x8008 ADD ADD 0x800C

0x800C ADD ADD 0x8010

0x8010 CMP CMP 0x8014

0x8014 SUBLT

0x8018

0x8018 MOV MOV

Exemple:

traduction d’un appel de sous- programme

0x8018

0x8018 MOV MOV 0x801C

0x801C MOV

@ programme principal

@ programme principal 0x8020

0x8020 MOV MOV 0x8024

0x8024 MOV

0x8028

0x8028 MOV

0x802C

0x802C MOV MOV 0x8030

0x8030 MOV MOV 0x8034

0x8034 MOV

0x8038

0x8038 MOV

Sans

instruction BL:

il faut

sauvegarder explicitement l’adresse de retour.

Cas de l’instruction BL

@ Fonction somme: n dans r1, résultat dans r0

@ Fonction somme: n dans r1, résultat dans r0 r4, #0

r4, #0 @ @ tmp tmp=0 =0 r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5, r1 r5, r1

pc, pc, #0x14 @ i<n : réitérer @ i<n : réitérer r0, r4

r0, r4 @ résultat = @ résultat = tmp tmp r0, r4

r0, r4 @ résultat = @ résultat = tmp tmp

pc, r14 @ return

@ programme principal

@ programme principal r1, #5

r1, #5 @ n = 5 @ n = 5 r14, pc

pc, 0x8000 @ appel à somme @ appel à somme r6, r0

r6, r0 @ r6 = résultat @ r6 = résultat r1, #10

r1, #10 @ n = 10 @ n = 10 r14, pc

pc, 0x8000 @ appel à somme @ appel à somme

(28)

Exécution séquentielle et rupture de

 Conclusion

Agir directement sur le PC est complexe et source d’erreur.

Rend un programme assembleur difficile à modifier.

Rend difficile l’appel à des sous programmes.

On utilise des instructions de branchement, associées à des étiquettes.

étiquettes.

Les étiquettes sont des adresses correspondant à une instruction, ou à une donnée.

Exemple:

VALEUR: .word 123

LOOP: MOV R1, R2

Un branchement vers une étiquette est codé dans l’instruction par un saut relatif (ou offset, ou déplacement signé).

Exécution séquentielle et rupture de séquence

Agir directement sur le PC est complexe et source d’erreur.

Rend un programme assembleur difficile à modifier.

Rend difficile l’appel à des sous programmes.

On utilise des instructions de branchement, associées à des Les étiquettes sont des adresses correspondant à une

instruction, ou à une donnée.

123

R1, R2

Un branchement vers une étiquette est codé dans l’instruction

par un saut relatif (ou offset, ou déplacement signé).

(29)

Instructions de branchement relatif

 Branch (B)

 Branch and Link (BL)

cond 1 0 1 25 24 26 27 28 31

L 23

 Offset : déplacement signé sur 24 bits

 L : Link (0 branch, 1 branch and link)

 Effets:

B: PC ← PC + offset

BL: r14 ← PC – 4; PC = PC + offset

r14 : Link Register (contient l’adresse de retour)

Instructions de branchement relatif

0 offset

déplacement signé sur 24 bits L : Link (0 branch, 1 branch and link)

4; PC = PC + offset

r14 : Link Register (contient l’adresse de retour)

(30)

Instructions de branchement relatif

 Exemple traduction d’une boucle

 Utilisation de labels en langage d’assemblage: le déplacement est calculé automatiquement par l’assembleur

MOV

MOV r4, #0 r4, #0 MOV

MOV r5, #0 r5, #0

1011 1 0 1 25 24 26 27 28 31

0 23

MOV

MOV r5, #0 r5, #0

loop: ADD ADD r4, r4, r5 r4, r4, r5 ADD

ADD r5, r5, #1 r5, r5, #1 CMP

CMP r5, #5 r5, #5 BLT loop

B LT

Instructions de branchement relatif

Exemple traduction d’une boucle for

en langage d’assemblage: le déplacement est calculé automatiquement par

r4, #0

r4, #0 @ @ tmp tmp=0 =0 r5, #0

r5, #0 @ i=0 @ i=0

0 0xFFFFFB

r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5, #5 r5, #5

loop @ i<5 : réitérer @ i<5 : réitérer

(FFFFFB)

hex

= (-5)

dec

(31)

Instructions de branchement relatif

 Exemple traduction d’une boucle

 Utilisation d’adresses en langage d’assemblage: le déplacement est calculé automatiquement par

l’assembleur

0x8000

0x8000 MOV MOV r4, #0 r4, #0

1011 1 0 1 25 24 26 27 28 31

0 23

0x8004

0x8004 MOV MOV r5, #0 r5, #0

0x8008 ADD ADD r4, r4, r5 r4, r4, r5 0x800C

0x800C ADD ADD r5, r5, #1 r5, r5, #1 0x8010

0x8010 CMP CMP r5, #5 r5, #5 0x8014

0x8014 BLT 0x8008

0x8018

0x8018 … …

B LT

(Loop:)

Instructions de branchement relatif

Exemple traduction d’une boucle for

en langage d’assemblage: le déplacement est calculé automatiquement par

r4, #0

r4, #0 @ @ tmp tmp=0 =0

0 0xFFFFFB

r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5, #5 r5, #5

0x8008 @ i<5 : réitérer @ i<5 : réitérer

(FFFFFB)

hex

= (-5)

dec

(Loop)

(32)

Instructions de branchement relatif

Exemple:

traduction d’un appel de sous- programme

@ Fonction somme: n dans r1, résultat dans r0

@ Fonction somme: n dans r1, résultat dans r0 somme: MOV MOV

MOV MOV loop ADD ADD ADD ADD CMP CMP BLT

L’instruction BL simplifie grandement l’écriture du programme assembleur.

MOV MOV MOV

@ programme principal

@ programme principal main:

main: MOV MOV BL MOV MOV MOV MOV BL MOV MOV

Instructions de branchement relatif

@ Fonction somme: n dans r1, résultat dans r0

@ Fonction somme: n dans r1, résultat dans r0 r4, #0

r4, #0 @ @ tmp tmp=0 =0 r5, #0

r5, #0 @ i=0 @ i=0 r4, r4, r5

r4, r4, r5 @ @ tmp tmp+=i +=i r5, r5, #1

r5, r5, #1 @ i++ @ i++

r5 r5, r1 , r1

loop @ i<5 : réitérer @ i<5 : réitérer r0, r4

r0, r4 @ résultat = @ résultat = tmp tmp

pc, lr @ return

@ programme principal

@ programme principal r1, #5

r1, #5 @ n = 5 @ n = 5

somme @ appel à somme @ appel à somme r6, r0

r6, r0 @ s1 = résultat @ s1 = résultat r1, #10

r1, #10 @ n = 10 @ n = 10

somme @ appel à somme @ appel à somme r7, r0

r7, r0 @ s2 = résultat @ s2 = résultat

Références

Documents relatifs

Stocker un petit ensemble dans les bits d’un entier non-signé Le bit i est à 1 ssi l’élément i est dans l’ensemble. → Énumérer les ensembles en énumérant

Since the processor does not have to wait for the LOAD to be completed, it can go on to execute additional instructions placed in between the LOAD instruction and

If R OYRCV is not asserted during aT d cycle, the T d cycle is extended to the next cycle by inserting a wait state (Tw). The processor continues to insert additional

The EXTEST guard values specified in Table 15: Boundary Scan Signals &amp; Pins should be clocked into the boundary-scan register (using the SAMPLE/PRELOAD instruction)

A full 32 bit DMA Controller supporting data trans- fers to/from VMEbus memory as well as to/from local system RAM is provided by a FORCE specific 280 pin Gate

■ Suspend current leakage control ensures that negligible power will be consumed in suspend mode without additional external buffering. 82C465MVB 32-Bit 486/586 Mobile Chipset

If so (a snoop hit), the corresponding cache entry is invali- dated, which will force the 80386 to fetch the up-to- date data from main memory the next time it access-

Pour généraliser cette structure afin de décrire la soustraction de nombres de taille supérieure à 1, il faut introduire une variable supplémentaire