TD informatique industrielle avec correction Arithmétique entière Donnez le rés

TD informatique industrielle avec correction Arithmétique entière Donnez le résultat (en décimal) et les valeurs de CF (Carry Flag – entiers non signés) et OF (Overflow Flag – entiers signés) après les opérations ci-dessous. Pour vous éviter d'avoir recours à une calculatrice, voici les valeurs de quelques puissances de 2 : 27 = 128 ; 28 = 256 ; 215=32768 ; 216 = 65536 . Taille opération Opération résultat signé résultat non signé CF = ? OF = ? 8 bits 0-1 ? ? ? ? 8 bits 127+1 ? ? ? ? 8 bits 0xFF+1 ? ? ? ? 8 bits -128-1 ? ? ? ? 16 bits 0-1 ? ? ? ? 16 bits 32767+1 ? ? ? ? 16 bits 0xFFFF+1 ? ? ? ? 16 bits -32768-1 ? ? ? ? Réponse: Taille opération Opération résultat signé résultat non signé CF = ? OF = ? 8 bits 0-1 -1 255 1 0 8 bits 127+1 -128 128 0 1 8 bits 0xFF+1 0 0 1 0 8 bits -128-1 127 127 0 1 16 bits 0-1 -1 65535 1 0 16 bits 32767+1 -32768 32768 0 1 16 bits 0xFFFF+1 0 0 1 0 16 bits -32768-1 32767 32767 0 1 Explication : - Ligne 1 : 0b00000000 - 0b1 = 0b11111111, valeur qui est interprétée comme 28 -1 dans les entiers non signés (avec un Carry Flag à 1 qui indique une retenue, donc un résultat invalide) ou comme -1 dans les entiers signés (avec un Overflow Flag à 0 qui indique un résultat valide). - Ligne 2 : 0b01111111 + 0b1 = 0b10000000, valeur qui est interprétée comme 27 dans les entiers non signés (avec un Carry Flag à 0 qui indique l'absence de retenue, donc un résultat valide) ou comme -27 dans les entiers signés (avec un Overflow Flag à 1 qui indique un résultat invalide). - Ligne 3 : 0b11111111 + 0b1 = 0b00000000, valeur qui est interprétée comme 0 dans les entiers non signés (avec un Carry Flag à 1 qui indique une retenue, donc un résultat invalide) et également comme 0 dans les entiers signés (mais cette fois avec un Overflow Flag à 0 qui indique un résultat valide). - Ligne 4 : 0b10000000 - 0b1 = 0b01111111, valeur qui est interprétée comme 27-1 dans les entiers non signés (avec un Carry Flag à 0 qui indique l'absence de retenue, donc un résultat valide) et également comme 27-1 dans les entiers signés (mais cette fois avec un Overflow Flag à 1 qui indique un résultat invalide). - Ligne 5 : 0b0000000000000000-0b1 = 0b1111111111111111, valeur qui est interprétée comme 216 -1 dans les entiers non signés (avec un Carry Flag à 1 qui indique une retenue, donc un résultat invalide) ou comme -1 dans les entiers signés (avec un Overflow Flag à 0 qui indique un résultat valide). - Ligne 6 : 0b0111111111111111+0b1 = 0b1000000000000000, valeur qui est interprétée comme 215 dans les entiers non signés (avec un Carry Flag à 0 qui indique l'absence de retenue, donc un résultat valide) ou comme - 215 dans les entiers signés (avec un Overflow Flag à 1 qui indique un résultat invalide). - Ligne 7 : 0b1111111111111111+0b1 = 0b0000000000000000, valeur qui est interprétée comme 0 dans les entiers non signés (avec un Carry Flag à 1 qui indique une retenue, donc un résultat invalide) et également comme 0 dans les entiers signés (mais cette fois avec un Overflow Flag à 0 qui indique un résultat valide). - Ligne 8 : 0b1000000000000000 – 0b1 = 0b0111111111111111, valeur qui est interprétée comme 215-1 dans les entiers non signés (avec un Carry Flag à 0 qui indique l'absence de retenue, donc un résultat valide) et également comme 215-1 dans les entiers signés (mais cette fois avec un Overflow Flag à 1 qui indique un résultat invalide). Instructions de copie Prérequis : structure d'un programme, structure d'une instruction, type et taille des opérandes, direction des instructions, instruction mov Donnez la valeur du registre %eax après l'exécution consécutive de chacune de ces instructions. 1. movl $0xEFFACE, %eax Réponse : 0xEFFACE explication : il s'agit d'une simple copie d'une constante (adressage immédiat) de 32 bits dans un registre de 32 bits. 2. movb $0b10, %ah Réponse : 0xEF02CE explication : %ah est la partie haute de 8 bits (2 chiffres hexadécimaux) du registre de 16 bits (4 chiffres hexadécimaux) %ax. %ax est lui-même la partie basse de 16 bits du registre %eax (32 bits, soit 8 chiffres hexadécimaux). La valeur binaire 0b10 contenue sur 1 octet (movb) correspond à un nombre hexadécimal de deux chiffres (0x02) qui va être copié et donc remplacer l'ancienne valeur (0xFA) contenue dans la partie %ah du registre %eax. 3. movw $10, %bx Réponse : 0xEF02CE explication : on copie la valeur 0x000A dans le registre %bx. %ax et %bx étant des registres séparés et indépendants, la valeur de %ax reste inchangée. 4. movw %bx, %ax Question: %ah=? Réponse : 0x00 explication : Le registre %bx contient la valeur hexadécimale 000A. Cette valeur est copiée dans le registre %ax. Le registre %al étant la partie basse de 8 bits (2 chiffres hexadécimaux) de %ax, sa valeur devient 0A. Le registre %ah étant la partie haute de 8 bits de %ax, sa valeur devient 0x00. Instructions additives Prérequis : Ceux du 15.1 + 2.2 (entiers signés et non signés) + débordements Donnez la valeur du registre %eax et des drapeaux OF, CF et ZF après l'exécution consécutive de chacune de ces instructions. 1. subl %eax, %eax Réponse : 0x00000000, ZF=1, CF=0, OF=0 explication : %eax contient une valeur de 32 bits quelconque. L'instruction subl %eax, %eax réalise la soustraction de cette valeur et d'elle-même. Le résultat, zéro est copié dans l'opérande destination : %eax. Le drapeau ZF (Zero Flag) du registre d'état (RFLAGS) prend la valeur 1, indiquant que le résultat est égal à zéro. 2. subw $1, %ax Réponse : 0x0000FFFF, ZF=0, CF=1, OF=0 explication : 0 — 1 = -1 . L'opération est réalisée sur 16 bits et sur le registre %ax, soit la partie basse de 8 chiffres hexadécimaux de %eax. 0xFFFF correspond à la valeur -1 codée en complément à deux. À l'issue de l'opération, le drapeau OF (Overflow) du registre d'état RFLAGS prend la valeur 0, indiquant la validité du résultat sur les entiers signés. Le drapeau CF (Carry Flag) prend quant à lui la valeur 1, indiquant un débordement sur les entiers non signés. 3. addl $2, %eax Réponse : 0x00010001, ZF=0, CF=0, OF=0 explication : L'opération étant réalisé sur 32 bits et sur %eax, la retenue est propagée jusqu'au 5e chiffre le plus à droite de %eax. L'opération est valide sur les entiers signés et non signés. 4. addl $0FFEFFFF, %eax Réponse : 0x10000000, ZF=0, CF=0, OF=0. Explication : La retenue est propagée jusqu'au chiffre hexadécimal le plus à gauche du registre 32 bits %eax. Le résultat est non nul, valide pour les entiers non signés et valide pour les entiers signés (ajout de 2 nombres positifs et résultat positif – bit de poids fort à 0). OF est donc positionné à 0. Sauts conditionnels et inconditionnels Quelle est la valeur de %ecx après l'exécution de ces petits programmes ? Il est dans certains cas impossible de déterminer cette valeur. Si c'est le cas, répondez par « indéfini ». 15.3.1 movl $0, %ecx Boucle: addl $1, %ecx jmp Boucle Réponse : indéfini. Explication : À l'entrée de la boucle, %ecx contient la valeur 0. La valeur 1 est ajoutée à %ecx à chaque itération. Mais « jmp » étant un saut inconditionnel, nous avons à faire à une boucle infinie. Il est donc impossible de connaître la valeur de %ecx après l'instruction « jmp » puisque le pointeur d'instruction n'atteindra jamais cette adresse. 15.3.2 Réponse : 0. Explication : À l'entrée de la boucle, %ecx contient la valeur 0. La valeur 1 est ajoutée à %ecx à chaque itération. « jnc Boucle » réalise un saut vers « addl $1, %ecx » lorsque le drapeau CF du registre d'état RFLAGS est à 0. Autrement dit, le saut sera effectué tant que l'opération « addl $1, %ecx » ne movl $0, %ecx Boucle: addl $1, %ecx jnc Boucle provoque pas de débordement sur les entiers non signés. Lorsque %ecx passe de 0xFFFFFFFF à 0, CF passe à 1 et l'instruction « jnc » ne réalise pas le saut. L'exécution se poursuit donc à l'instruction qui suit immédiatement « jnc Boucle ». La valeur de %ecx est alors 0. 15.3.3 Réponse : 0. Explication : À l'entrée de la boucle, %ecx contient la valeur 0. La valeur 1 est ajoutée à %ecx à chaque itération. « jnc Boucle » réalise un saut vers « addl $1, %ecx » lorsque le drapeau OF du registre d'état RFLAGS est à 0. Autrement dit, le saut sera effectué tant que l'opération « addl $1, %ecx » ne provoque pas de débordement sur les entiers signés. Lorsque %ecx passe de 0x0FFFFFFF à 0x10000000, uploads/Religion/ td-informatique-industrielle-avec-correction.pdf

  • 44
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Fev 26, 2021
  • Catégorie Religion
  • Langue French
  • Taille du fichier 0.2905MB