Aide sur langage assembleur

spoonatte Messages postés 85 Statut Membre -  
spoonatte Messages postés 85 Statut Membre -
Bonjour,
J'ai lu que CF est positionné à 1 si la dernière opération a générée une retenue.
alors, j'ai fait les opération suivantes :
MOV AL,01H  
MOV BL, 0FFH  
SUB AL,BL 

et quand j'ai déboguée le programme CF est positionné à 1, même si le résultat est AL=02H !!

2 réponses

  1. Panoramix. Messages postés 3051 Statut Membre 1 098
     
    Salut,

    Alors de mémoire :)

    Tu attribues les valeurs (en décimal) : AL = 1 et BL = 255. Tu soustrais ensuite AL - BL et tu stocks le résultats dans AL (=-254). Vu que le résultat est négatif, OV est incrémenté de 1 (= CF dans ton cas ?). Carry n'est pas incrémenté vu que le résultat ne dépasse pas 8 bit.

    Je sais pas si ça peut t'aider, le cas échéant, je ressors mon cours d'assembleur :)

    NB : ces référence sont pour le X51... après je sais pas quelle micro-processeur tu utilises...
    1
    1. spoonatte Messages postés 85 Statut Membre
       
      J'utilise le µprocesseur 8086.
      j'ai utilisé l'émulateur 8086, et j'ai lancé le programme étape par étape, et l'émulateur me montre que CF=1.
      en utilisant complément à 15 : - 0FFh = 00h.
      et en utilisant complément à 16 : - 0FFh = 01h.
      alors AL = 01h + 01h = 02h
      0
    2. Panoramix. Messages postés 3051 Statut Membre 1 098
       
      CF = carry, il est incrémenter si le résultat dépasse 255.

      A combien est le SF ?
      0
    3. spoonatte Messages postés 85 Statut Membre
       
      SF = 0
      IF = AF = 1
      0
    4. Panoramix. Messages postés 3051 Statut Membre 1 098
       
      IF = 1 : une erreur ?

      Pourquoi tu obtiens 2 (décimal) dans AL ? Tu devrais obtenir 254 et avoir une retenue dans IF.

      Tu n'est pas d'accord ?

      Test avec :

      sub 1h,FFh

      Tu obtiens quoi dans CF et IF ?
      0
    5. spoonatte Messages postés 85 Statut Membre
       
      CF=1 , IF = 1
      0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    mov al, 01h
    mov bl, 0ffh,
    sub al, bl

    Le micropro va calculer le complément à 2 de bl qui est 01h
    Ensuite, le micropro va sommer al et -bl : al = 1 + 1 = 2.
    Il n'y a aucune retenue donc cf=1 (c'est inversé par rapport à l'addition).

    On a donc bel et bien al = 02h et cf = 1.

    Sauf erreur de ma part bien sûr. L'asm remonte ^^.
    1
    1. Panoramix. Messages postés 3051 Statut Membre 1 098
       
      Mais pourquoi CF = 1 ?

      Selon la doc :

      CF (Carry Flag) :

      Retenue : cet indicateur et mis à 1 lorsque il y a une retenue du résultat à 8 ou 16 bits. il intervient dans les opérations d'additions (retenue) et de soustractions (borrow) sur des entiers naturels. Il est positionné en particulier par les instructions ADD, SUB et CMP.
      0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Le second argument (0ffh) est plus grand que le premier (01h). Donc CF = 1.
      0
    3. Panoramix. Messages postés 3051 Statut Membre 1 098
       
      Mais il n'y a pas de retenu, non ? C'est ce à quoi sert carry ; utiliser des chiffres qui dépassent 8bits ?
      0
    4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Oui, mais la cary sert aussi de borrow flag.
      Et donc CF devient à 1 lorsqu'on le micropro calcule a-b avec b>a.
      0
    5. spoonatte Messages postés 85 Statut Membre
       
      0ffh = -1d alors b<a, et tu as dit que b>a :-/ je ne peux pas comprendre
      0