UE MAREP Cours 5 : Structures de contrôle représentées en assembleur Patricia Renault UPMC 2005/2006
Plan Nécessité de la rupture de séquence Exemple de programme sans rupture de séquence Exemple de programme avec rupture de séquence Sauts conditionnels et inconditionnels Détermination de l’adresse de saut Réalisation des structures de contrôle des langages de haut niveau à l’aide de saut Code ASCII
Exemple de programme sans rupture de séquence .data .stack .text __start: PC <= 0x00400000 xor $3, $3, $3 0x00400000 : $3 = 0 xor $4, $4, $4 0x00400004 : $4 = 0 addi $3, $3, 1 0x00400008 : $3 = 1 add $4, $4, $3 0x0040000c : $4 = 1 addi $3, $3, 1 0x00400010 : $3 = 2 add $4, $4, $3 0x00400014 : $4 = 3 addi $3, $3, 1 0x00400018 : $3 = 3 add $4, $4, $3 0x0040001c : $4 = 6 ori $2, $0, 10 0x00400020 : $2 = 10 syscall 0x00400024
Exemple de programme avec rupture de séquence .data .stack .text __start: PC <= 0x00400000 xor $3, $3, $3 0x00400000 : $3 = 0 xor $4, $4, $4 0x00400004 : $4 = 0 debut: addi $3, $3, 1 0x00400008 : $3 = 1, 2, 3, … add $4, $4, $3 0x0040000c : $4 = 1, 3, 6, … j debut 0x00400010 : ori $2, $0, 10 0x00400014 : $2 = 10 syscall 0x00400018 :
Nécessité de la rupture de séquence Comment sortir de la boucle après 3 itérations ? Saut conditionnel Utiliser un registre initialisé à 3, lui soustraire 1 avant chaque branchement conditionnel, se brancher en début de boucle si le registre compteur n’a pas atteint la valeur 0. Utiliser un registre initialisé à 0, lui ajouter 1 avant chaque branchement conditionnel, se brancher en début de boucle si le registre compteur n’a pas atteint la valeur 3.
Plan Nécessité de la rupture de séquence Sauts inconditionnels et conditionnels Instructions MIPS Exemples Détermination de l’adresse de saut Réalisation des structures de contrôle des langages de haut niveau à l’aide de saut Code ASCII
Déplacement en séquence = Aller à l’instruction suivante Instructions MIPS Inconditionnels : Valeur de PC systématiquement modifiée. 2 formes : j label, met dans PC la valeur associée à l’étiquette label jr Ri, met dans PC la valeur contenue dans le registre Ri Conditionnels : Tests d’égalité ou de différence de contenu de deux registres beq $2, $3, fin, (branch if equal) si $2=$3 alors branchement à l’étiquette fin, sinon déplacement en séquence bne $2, $3, fin, (branch in not equal) si $2$3 alors branchement à l’étiquette fin, sinon déplacement en séquence Déplacement en séquence = Aller à l’instruction suivante
Instructions MIPS Conditionnels : Comparaison d’une valeur par rapport à 0 bgez $3, label, (branch if greater or equal than zero) si $3>=0 alors branchement à l’étiquette label, sinon déplacement en séquence bgtz $3, label, (branch if greater than zero) si $3>0 alors branchement à l’étiquette label, sinon déplacement en séquence blez $3, label, (branch if less or equal than zero) si $3<=0 alors branchement à l’étiquette label, sinon déplacement en séquence bltz $3, label, (branch if less than zero) si $3<0 alors branchement à l’étiquette label, sinon déplacement en séquence
Instructions MIPS Conditionnels : Comparaison de deux valeurs non nulles slt $2, $3, $4, (set if less than) comparaison signée, met 1 dans $2, si $3<$4, met 0 sinon sltu $2, $3, $4, (set if less than) comparaison non signée, met 1 dans $2, si $3<$4, met 0 sinon
Exemple .data .stack .text __start: ori $3, $0, 3 #$3 = 3 xor $4, $4, $4 #$4 = 0 debut: add $4, $4, $3 #$4 = 3, 5 puis 6 addi $3, $3, -1 #$3 = 2, 1 puis 0 bgtz $3, debut ori $2, $0, 10 syscall
Exemple .data .stack .text __start: xor $3, $3, $3 #$3 = 0 ori $5, $0, 3 #$5 = 3 debut: addi $3, $3, 1 #$3 = 1, 2 puis 3 add $4, $4, $3 #$4 = 1, 3 puis 6 bne $3, $5, debut ori $2, $0, 10 syscall
Exemples Saut à l’adresse label si $2<$3 slt $4, $2, $3 bne $4, $0, label Saut à l’adresse label si $2=<$3 slt $4, $3, $2 beq $4, $0, label Saut à l’adresse label si $2>$3 slt $4, $3, $2 bne $4, $0, label Saut à l’adresse label si $2>=$3 slt $4, $2, $3 beq $4, $0, label
Plan Nécessité de la rupture de séquence Sauts Détermination de l’adresse de saut Réalisation des structures de contrôle des langages de haut niveau à l’aide de saut Code ASCII
Détermination de l’adresse de saut Deux formes d’adressage : absolu : concerne uniquement les instructions de format J. Le label (sur 26 bits) est une partie de l’adresse à laquelle il faut se brancher. (ex : j label donne PC := PC 31 :28 || I * 4) relatif : concerne les instructions Bxx. Le déplacement est relatif à la valeur actuelle de PC (ex : bne Rx, Ry, label donne PC := PC + 4 + (I * 4) ) 000010 Immédiat sur 26 bits 000101 Rx Ry Immédiat sur 16 bits
Détermination de l’adresse de saut Nécessite de connaître les adresses d’implantation des instructions pour pouvoir déterminer la valeur du champs immédiat (I) dans les formats J et I pour les sauts => la compilation nécessite deux passes l’une implante toutes les instructions, sur 32 bits, en laissant les champs I à une valeur qui n’est pas définitive puis une fois toutes les instructions implantées, les adressages absolus sont résolus (il suffit de placer la partie de l’adresse de l’instruction vers laquelle on saute dans le champs i de l’instruction de saut), et les décalages des adressages relatifs sont calculés (en fonction de l’adresse de l’instruction de saut et de l’adresse de l’instruction vers laquelle on saute).
Détermination de l’adresse de saut Première passe .data .stack .text fin: ori $2, $0, 10 0x00400000 0x3402000a syscall 0x00400004 0x0000000c __start: PC <= 0x00400008 xor $3, $3, $3 0x00400008 0x00631826 xor $4, $4, $4 0x0040000c 0x00842026 ori $5, $0, 3 0x00400010 0x34050003 deb: addi $3, $3, 1 0x00400014 0x20630001 add $4, $4, $3 0x00400018 0x00832020 bne $3, $5,deb 0x0040001c 0x1465XXXX j fin 0x00400020 0b000010BBBBBBBB…B 26 bits
Détermination de l’adresse de saut Seconde passe .data .stack .text fin: ori $2, $0, 10 0x00400000 0x3402000a syscall 0x00400004 0x0000000c __start: PC <= 0x00400008 xor $3, $3, $3 0x00400008 0x00631826 xor $4, $4, $4 0x0040000c 0x00842026 ori $5, $0, 3 0x00400010 0x34050003 deb: addi $3, $3, 1 0x00400014 0x20630001 add $4, $4, $3 0x00400018 0x00832020 bne $3, $5,deb 0x0040001c 0x1465FFFD j fin 0x00400020 0x08100000
Plan Nécessité de la rupture de séquence Sauts Détermination de l’adresse de saut Réalisation des structures de contrôle des langages de haut niveau à l’aide de saut Si-Alors Si-Alors-Sinon Boucle Tant-Que Répéter jusqu’à Répéter n fois Code ASCII
Si Alors Instruction i … Instruction i VRAI FAUX Si condition alors Instructions j Instructions k VRAI FAUX … Instruction i Si condition alors Instructions j Fin si Instructions k
Si Alors Instruction i FAUX VRAI Condition ? Instructions j Instructions k FAUX VRAI … Inst i Elaboration de condition Bcondition_vraie LV J LF LV : Inst j LF : Ints k … Inst i Elaboration de condition Bcondition_fausse LF Inst j LF : Ints k
Si-Alors-Sinon Instruction i Condition ? Instructions j Instructions k VRAI FAUX Instructions m … Instruction i Si condition alors Instructions j Sinon Instruction m Fin si Instructions k
Si-Alors-Sinon Instruction i Condition ? Instructions j Instructions k VRAI FAUX Instructions m … Inst i Elaboration de condition Bcondition_vraie LV Inst m J Fin LV : Ints j Fin : Inst k
Boucle - Tant que Instruction i FAUX VRAI Condition ? Instructions j Instructions k VRAI FAUX … Inst i Tq : Elaboration de condition Bcondition_faux Fin Inst j J Tq Fin : Inst k … Instruction i Tant que condition alors Instructions j Fin tant que Instructions k
Boucle - Répéter jusqu’à Instruction i Condition ? Instructions j Instructions k VRAI FAUX … Instruction i Faire Instructions j Tant que condition Instructions k … Inst i Do : Inst j Elaboration de condition Bcondition_vrai Do Fin : Inst k
Plan Nécessité de la rupture de séquence Sauts Détermination de l’adresse de saut Réalisation des structures de contrôle des langages de haut niveau à l’aide de saut Code ASCII
Code ASCII Convention internationale sur 7 bits : Extension aux caractères français (ISO_LATIN)
Exemple .data message : .asciiz "bonjour" .stack .text lui $5, message>>16 ori $5, $5, message &0xFFFF boucle : lb $6,($5) beq $6, $0, fin addi $6, $6, -0x20 sb $6,($5) addi $5, $5, 1 j boucle fin : ori $2, $0, 10 syscall