Aide sur langage assembleur

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

  • Votes
  • Date
  • Date décroissante
  1. 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. 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
    2. CF = carry, il est incrémenter si le résultat dépasse 255.

      A combien est le SF ?
    3. SF = 0
      IF = AF = 1
    4. 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 ?
    5. CF=1 , IF = 1
  2. Contributeur
    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. 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.
    2. Contributeur
      Le second argument (0ffh) est plus grand que le premier (01h). Donc CF = 1.
    3. Mais il n'y a pas de retenu, non ? C'est ce à quoi sert carry ; utiliser des chiffres qui dépassent 8bits ?
    4. Contributeur
      Oui, mais la cary sert aussi de borrow flag.
      Et donc CF devient à 1 lorsqu'on le micropro calcule a-b avec b>a.
    5. 0ffh = -1d alors b<a, et tu as dit que b>a :-/ je ne peux pas comprendre