Correction TD - ENSEIRB

publicité
Instructions
Correction TD
Bordeaux INP - ENSEIRB-MATMECA
16 mars 2016
Instructions
Rappel des instructions
Abrev.
Codage
Description
NOR
ADD
00 AAAAAA1
01 AAAAAA1
STA
JCC
10 AAAAAA1
11 DDDDDD2
ACCU = ACCU NOR Mem[AAAAAA]
ACCU = ACCU + Mem[AAAAAA]
mise à jour de la retenue
Mem[AAAAAA] = ACCU
Si Carry = 0 alors PC DDDDDD
sinon effacer la retenue (Carry = 0)
(1)
AAAAAA : bits d’adressage ;
(2)
DDDDDD : bits de données
Table : Jeu d’instructions du processeur
Instructions
Contenu RAM
Mémoire du processeur minimal 8 bits
Adr.
00
01
02
03
04
05
06
07
08
Hex
X"08"
X"47"
X"86"
X"C4"
X"C4"
X"00"
X"00"
X"7E"
X"FE"
Bin
00001000
01000111
10000110
11000100
11000100
00000000
00000000
01111110
11111110
Interprétation
Valeur
Accu
Mem
(hex)
Mem
(bin)
Adresse[00,04] : instructions mémorisées ; Adresse[05,08] : données mémorisées
Instructions
Contenu RAM
Mémoire du processeur minimal 8 bits
Adr.
00
Hex
X"08"
Bin
00001000
01
02
03
04
05
06
07
08
X"47"
X"86"
X"C4"
X"C4"
X"00"
X"00"
X"7E"
X"FE"
01000111
10000110
11000100
11000100
00000000
00000000
01111110
11111110
Interprétation
ACCU = ACCU
NOR mem[8]
donnée
donnée
donnée
donnée
Valeur
Accu
00000000
00000001
Mem
(hex)
Mem
(bin)
X"00"
X"00"
X"7E"
X"FE"
00000000
00000000
01111110
11111110
Adresse[00,04] : instructions mémorisées ; Adresse[05,08] : données mémorisées
Instructions
Contenu RAM
Mémoire du processeur minimal 8 bits
Adr.
00
Hex
X"08"
Bin
00001000
01
X"47"
01000111
02
03
04
05
06
07
08
X"86"
X"C4"
X"C4"
X"00"
X"00"
X"7E"
X"FE"
10000110
11000100
11000100
00000000
00000000
01111110
11111110
Interprétation
ACCU = ACCU
NOR mem[8]
ACCU = ACCU
+ mem[7]
donnée
donnée
donnée
donnée
Valeur
Accu
00000000
00000001
00000001
01111111
Mem
(hex)
Mem
(bin)
X"00"
X"00"
X"7E"
X"FE"
00000000
00000000
01111110
11111110
Adresse[00,04] : instructions mémorisées ; Adresse[05,08] : données mémorisées
Instructions
Contenu RAM
Mémoire du processeur minimal 8 bits
Adr.
00
Hex
X"08"
Bin
00001000
01
X"47"
01000111
02
03
04
05
06
07
08
X"86"
X"C4"
X"C4"
X"00"
X"00"
X"7E"
X"FE"
10000110
11000100
11000100
00000000
00000000
01111110
11111110
Interprétation
ACCU = ACCU
NOR mem[8]
ACCU = ACCU
+ mem[7]
mem[6] = ACCU
donnée
donnée
donnée
donnée
Valeur
Accu
00000000
00000001
00000001
01111111
Mem
(hex)
Mem
(bin)
X"00"
X"7F"
X"7E"
X"FE"
00000000
01111111
01111110
11111110
Adresse[00,04] : instructions mémorisées ; Adresse[05,08] : données mémorisées
Instructions
Contenu RAM
Mémoire du processeur minimal 8 bits
Adr.
00
Hex
X"08"
Bin
00001000
01
X"47"
01000111
02
03
04
05
06
07
08
X"86"
X"C4"
X"C4"
X"00"
X"00"
X"7E"
X"FE"
10000110
11000100
11000100
00000000
00000000
01111110
11111110
Interprétation
ACCU = ACCU
NOR mem[8]
ACCU = ACCU
+ mem[7]
mem[6] = ACCU
PC = 04
donnée
donnée
donnée
donnée
Valeur
Accu
00000000
00000001
00000001
01111111
Mem
(hex)
Mem
(bin)
X"00"
X"7F"
X"7E"
X"FE"
00000000
01111111
01111110
11111110
01111111
Adresse[00,04] : instructions mémorisées ; Adresse[05,08] : données mémorisées
Instructions
Contenu RAM
Mémoire du processeur minimal 8 bits
Adr.
00
Hex
X"08"
Bin
00001000
01
X"47"
01000111
02
03
04
05
06
07
08
X"86"
X"C4"
X"C4"
X"00"
X"00"
X"7E"
X"FE"
10000110
11000100
11000100
00000000
00000000
01111110
11111110
Interprétation
ACCU = ACCU
NOR mem[8]
ACCU = ACCU
+ mem[7]
mem[6] = ACCU
PC = 04
PC = 04
donnée
donnée
donnée
donnée
Valeur
Accu
00000000
00000001
00000001
01111111
Mem
(hex)
Mem
(bin)
X"00"
X"7F"
X"7E"
X"FE"
00000000
01111111
01111110
11111110
01111111
01111111
Adresse[00,04] : instructions mémorisées ; Adresse[05,08] : données mémorisées
Instructions
Calcul du PGCD de deux nombres
Pseudo code Version 1 :
diff = 1
until(diff eq 0)
diff = a-b
if(diff < 0)
b = -diff
else
a = diff
end if
end until
Instructions
Calcul du PGCD de deux nombres
Pseudo code Version 2 : on utilise l’ACCU
ACCU = 1
until(ACCU eq 0)
ACCU = a-b
// ACCU = diff
if(ACCU < 0)
b = -ACCU // b = - diff
else
a = ACCU
// a = diff
end if
end until
Instructions
Calcul du PGCD de deux nombres
Pseudo code Version 3 : on utilise les instructions JUMP et les
ETIQUETTES
START:
ACCU = a-b
JUMP TO NEG SI ACCU < 0
a = ACCU
JUMP TO END SI a eq 0
JUMP TO START
NEG:
b = -ACCU
JUMP TO START
END:
JUMP TO END
// ACCU = diff
// a = diff
// b = -diff
Instructions
Calcul du PGCD de deux nombres
Pseudo code Version 4 : on détaille les opérations arithmétiques
et logiques avec NOR et ADD uniquement
START:
ACCU = ACCU NOR xFF
ACCU = ACCU NOR b
ACCU = ACCU + 1
ACCU = ACCU + a
JUMP TO NEG SI ACCU < 0
a = ACCU
JUMP TO END SI a eq 0
JUMP TO START
//
//
//
//
ACCU
ACCU
ACCU
ACCU
=
=
=
=
0
NOT(b)
-b
a - b = diff
NEG:
ACCU = ACCU NOR x00
ACCU = ACCU + 1
b = ACCU
JUMP TO START
// ACCU = not(diff)
// ACCU = - diff
END:
JUMP TO END
// a = diff
Instructions
Calcul du PGCD de deux nombres
Il reste à détailler les JUMP en utilisant la carry de l’UAL
Rappel : Carry=1 ssi le résultat de l’UAL dépasse la valeur 255 en
non-signé
JUMP TO NEG SI ACCU < 0
<=> JUMP TO NEG SI -ACCU > 0
Sol. 1 :
ACCU = -ACCU
ACCU = ACCU + 128
JUMP TO NEG SI CARRY=0
Sol.2 : Hypothèse : ACCU contient le résultat de la soustraction de
deux nombres positifs : diff = a - b
Si le résultat est positif, alors carry = 1
Si le résultat est négatif, alors carry = 0
JUMP TO NEG SI CARRY=0
Instructions
Calcul du PGCD de deux nombres
Pseudo code Version 5 : on détaille les opérations de saut
START:
ACCU = ACCU
ACCU = ACCU
ACCU = ACCU
ACCU = ACCU
JCC NEG
a = ACCU
ACCU = ACCU
JCC END
JCC START
NOR xFF
NOR b
+ 1
+ a
//
//
//
//
ACCU
ACCU
ACCU
ACCU
=
=
=
=
0
NOT(b)
-b
a - b = diff
// a = diff
+ xFF
NEG:
ACCU = ACCU NOR x00
ACCU = ACCU + 1
b = ACCU
JCC START
END:
JCC END
// ACCU = not(diff)
// ACCU = - diff
Instructions
Calcul du PGCD de deux nombres
Code assembleur commenté
start :
NOR
NOR
ADD
ADD
JCC
STA
ADD
JCC
JCC
allone;
b;
one;
a;
neg;
a;
allone;
end ;
start;
Accu = X NOR 11111111= 0
Accu = not (b)
Accu = not (b) + 1= - b
Accu = a - b
si carry= 0 alors neg sinon carry=0
a=Accu
Accu = Accu + 11111111 d’où carry =1 sauf si a=0
si carry= 0 alors end sinon carry=0
carry=0 alors start
NOR
ADD
STA
JCC
zero;
one;
b;
start;
Accu = Accu’ NOR 00000000 = not (Accu’)
Accu = not (Accu’) + 1 = -Accu’
b=Accu
si carry= 0 alors start sinon carry=0
JCC
end ;
carry=0 alors end
neg :
end :
(le résultat est en b)
Téléchargement