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)