Assembleur Pile

bolo972 Messages postés 87 Statut Membre -  
sam3000 Messages postés 1226 Statut Membre -
Bonjour

l' Asembleur me tues , plus je l'etudie moins je comprend lol
Voici mon exo
L'interruption matérielle numéro 1 est déclenchée après chaque instruction du processeur dans le cas ou TF=1. Le bit TF est le bit 8 du registre des indicateurs du 8086.

Que représente TF ?

Le programme suivant permet de mettre à 1 le bit TF
pushf
pop ax
or ax,100h
push ax
popf


je comprends pas que le programme mets TF a 1

merci a Tous et Bonne année

17 réponses

  1. grdscarabee Messages postés 134 Statut Membre 74
     
    Salut,

    Bon la manière dont est programmée le petit prog est un peu barbare, digne d'un compilateur.....

    pushf # empile
    pop ax # depile dans ax
    or ax,100h # fait un ou de la val de ax avec 100h
    push ax # reempile
    popf # depile

    En fait tout est dans le or ax, 100h, je ne connais pas trop l'assembleur mais 100h doit être un masque......il te permet de ne modifier qu'un seul bit dans le registre sans toucher aux 15 autres...ton TF doit être un flag

    Voilà bonne année

    GrdScarabe

    Learn with the best, teach the others
    0
  2. bolo972 Messages postés 87 Statut Membre 6
     
    ici
    http://www.commentcamarche.net/asm/pile.php3
    on explique comment utiliser les piles

    1° compile Push AX
    puis on decompile Pop AX
    pushf # empile

    que représente f
    pop ax # depile dans ax 

    pourquoi décompile t il ax ?

    merci
    0
  3. sam3000 Messages postés 1226 Statut Membre 144
     
    Salut,
    tu devra comprendre la structure des processeurs x86 en premier!

    TF: veut dire Trap Flag, c'est la methode qu'un debuggeur utilise pour faire du pas à pas.
    PUSHF: sert a mettre le registre F (Flags) sur la pile
    si on depile dans AX c'est pour faire (AX reçoi FLAGS)
    La sequence que tu as ecrit sert a mettre à un le bit 8 du registre F (qui est le Trap Flag).
    si tu execute ce code rien ne se passera, sauf si tu as deja definit l'interruption #1

    Normalement un programme utilisateur n'y accede pas (car c'est pas son rôle de faire du pas a pas)

    tu devra expliquer pourquoi tu fait cette manipulation et sur quelle plaeforme tu travaille (c'est surement pas Windows :) )

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique.
    0
  4. bolo972 Messages postés 87 Statut Membre 6
     
    tu devra comprendre la structure des processeurs x86 en premier!
    ce que j'essaye de faire
    TF: veut dire Trap Flag, c'est la methode qu'un debuggeur utilise pour faire du pas à pas.
    PUSHF: sert a mettre le registre F (Flags) sur la pile
    si on depile dans AX c'est pour faire (AX reçoi FLAGS)
    La sequence que tu as ecrit sert a mettre à un le bit 8 du registre F (qui est le Trap Flag).


    Dc pour l'instant TF est 0

    Normalement un programme utilisateur n'y accede pas (car c'est pas son rôle de faire du pas a pas)
    tu devra expliquer pourquoi tu fait cette manipulation et sur quelle plaeforme tu travaille (c'est surement pas Windows :) )


    c'est l'exo d'un exercice
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sam3000 Messages postés 1226 Statut Membre 144
     
    Oui, dans le programme normalement TF=0
    on la met à 1 pour activer l'utilisation de l'interruption TRAP (ou plutot Exception #1, dans le jargon x86)
    à l'interieur de l'INT#1, TF revient à 0, c'est du gestionnaire de l'INT 1 de remettre TF=1 pour le prochain "PAS" (STEP).

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique.
    0
  7. bolo972 Messages postés 87 Statut Membre 6
     
    l'instruction or est un Ou logique,?
    dc on compare as et 100 h ?
    100h représente en binaire
    100000000
    est que bien ca
    0
  8. sam3000 Messages postés 1226 Statut Membre 144
     
    non, on ne compare pas!

    F=F or 100h
    c'est equivalent (binaire) à:
    F=F + 100h

    quelque soit la valeur de F (16bits) : ffffffffffffffff
    elle deviendra : fffffff1ffffffff

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique.
    0
    1. bolo972 Messages postés 87 Statut Membre 6
       
      OR - Inclusive Logical OR
      Syntaxe : OR Destination, Source
      Destination et source sont combines bit a bit par l'operateur logique OU : Tout bit de destination est mis a 1 si le bit de source correspondant est a 1, sinon, il reste inchange.


      F = F ok
      F = 15 = 1111

      c bien ca
      0
      1. sam3000 Messages postés 1226 Statut Membre 144 > bolo972 Messages postés 87 Statut Membre
         
        oui, l'operation s'effectue bit à bit,
        Or, nous avons un seul bit à 1 dans 100h (bit n°8, en comptant du 0)
        donc c'est ce bit qui est à mettre à 1, les autres on ne change pas.
        Sachant que: TF=bit_8 du FLAGS

        L'erreur est humaine mais un véritable désastre
        ne peut être qu'informatique.
        0
  9. sam3000 Messages postés 1226 Statut Membre 144
     
    à mon avis, le but de l'exercice, c'est de montrer l'interêt de l'INT#1, et la manipulation du registre FLAGS
    Or, il n'y a pas d'instructions arithmetiques/binaires en assembleur qui manipulent ce registre, donc il faut passer par l'accumulateur 16 bits : AX

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique.
    0
  10. bolo972 Messages postés 87 Statut Membre 6
     
    si je veux mettre TF a 0 , j'utilise l'instruction AND

    and ax, 0h ,?
    0
  11. sam3000 Messages postés 1226 Statut Membre 144
     
    pour mettre TF à zero, il faut:

    and ax,0FEFFh

    -> tous les bits inchangés à 1 sauf celui que nous voulons modifier: le contraire de OR.

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique.
    0
  12. bolo972 Messages postés 87 Statut Membre 6
     
    en fait TF c'est le bit numéro 8
    dc on ne modifie que celui ci avec
    and ax,0FEFFh
    0
  13. bolo972 Messages postés 87 Statut Membre 6
     
    dans la deuxième question on me demande ca

    2. Ecrire un programme ayant deux taches :
    - Tache principale : mettre TF=1 , mettre cl=1 ch=2 dl=3 dh=4, mettre TF=0
    - Tache d'interruption numéro 1 : Afficher CL, CH ,DL et DH en utilisant le sous-programme d'affichage en binaire. Entre chaque valeur afficher un espace code ascii 2016 en utilisant un sous-programme nommé espace. A la fin de l'affichage de cl ch dl dh faire un retour à la ligne en utilisant un sous-programme nommé ligne. Les deux codes ascii à afficher pour passer à la ligne suivante sont A16 (line feed) et D16. (carriage return)

    pour la première partie j'ai fai ca

    PUSHF
    POP ax
    or as,100h
    push ax
    pop f
    mov cl,1
    mov ch,2
    mov dl,3
    mov dh,4


    j'avoue que la dexième partie je ne comprends pas trop :(

    ps: cet exercice n'est pas un exercice a remettre , un exercice dc j'ai la correction. Cependant je ne comprends pas dc je tente de le refaire en comprenais tt les points
    0
  14. sam3000 Messages postés 1226 Statut Membre 144
     
    je pose une derniere question aujourd'hui et on continue la discussion demain si tu veut bien.

    sur quelle plateforme tu travaille? PC ou maquette à base d'un 8086?
    sur quel systeme d'exploitation? (ex: DOS, Windows...)

    avec quel assembleur tu programme ou interface de programmation? (ex: MASM, TASM...)

    à demain.

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique.
    0
    1. bolo972 Messages postés 87 Statut Membre 6
       
      oui moi meme je commence a etre fatiguée par l'assembleur ;)

      je travaille sous PC / windows /8086

      j'utilise Scite comme compilateur

      a demain
      0
  15. bolo972 Messages postés 87 Statut Membre 6
     
    Tache d'interruption numéro 1 : Afficher CL, CH ,DL et DH en utilisant le sous-programme d'affichage en binaire. Entre chaque valeur afficher un espace code ascii 2016 en utilisant un sous-programme nommé espace. A la fin de l'affichage de cl ch dl dh faire un retour à la ligne en utilisant un sous-programme nommé ligne. Les deux codes ascii à afficher pour passer à la ligne suivante sont A16 (line feed) et D16. (carriage return)
    je comprends vraiment pas ce qu'il faut faire
    0
  16. sam3000 Messages postés 1226 Statut Membre 144
     
    je vais faire les suppositions suivantes:
    1. nous avons des sous-programmes :
    a. afficher un nombre dans AL en binaire : binaire
    b. afficher un espace : espace
    c. afficher une ligne : ligne
    2. nous definissons notre sous-programme d'interruption: inter1
    inter1   proc
                push ax
    
                mov al, cl
                call binaire
                call espace
    
                mov al, ch
                call binaire
                call espace
    
                mov al, dl
                call binaire
                call espace
    
                mov al, dh
                call binaire
                call espace
    
                call ligne
    
                pushf
                pop ax
                or ax, 100h
                push ax
                popf
                iret
    inter1   end
    


    si t'as un exemple dans le cours qui ressemble à ce que tu demande, ou donne la maniere de definir une interruption sur ton compilateur, il faudrai que je le vois!

    @+

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique
    0
  17. bolo972 Messages postés 87 Statut Membre 6
     
    la correction c ca
    .model small
    .stack 100h
    .code
           mov ah,35h
           mov al,1 
           int 21h    
           push bx; sauvegarde du vecteur dans la pile
           push es
           mov ax,seg spit1
           mov ds,ax         
           mov dx,offset spit1
           mov ax,2501h
           int 21h
           pushf ; Mise à 1 de TF
           pop ax
           or ax,0100h
           push ax
           popf
           mov ch,1 ; Programme à débugger
           mov cl,2
           mov dh,3
           mov dl,4
           pushf ; Mise à 0 de TF
           pop ax
           and ax,0EFFh
           push ax
           popf
           pop ds ; reprise de l'ancien vecteur dans le pile
           pop dx
           mov ax,2501h
           int 21h
           mov ah,4ch
           int 21h
    ; Procédure d'affichage en binaire
    proc AffBin
          push ax
          push bx
          push cx
          push dx
          mov cl,8
    ABboucle:
          mov dl,'0'
          shl bl,1
          Jnc ABzero
          mov dl,'1'
    ABzero:
          mov ah,02
          int 21h
          sub cl,1
          Ja ABboucle
          pop dx
          pop cx
          pop bx
          pop ax
          ret
    endp
    spit1 proc ; Sous programme d'interruption
       push bx
       mov bl,cl
       call AffBin
       call espace
       mov bl,ch
       call AffBin
       call espace
       mov bl,dl
       call AffBin
       call espace
       mov bl,dh
       call AffBin
       call ligne
      pop bx
      iret
    endp
    ligne proc
          push ax
          push dx
          mov ah,2
          mov dl,0Ah
          int 21h
          mov dl,0Dh
          int 21h
          pop dx
          pop ax
          ret
    endp
    espace proc
          push ax
          push dx
          mov ah,2
          mov dl,20h
          int 21h
          pop dx
          pop ax
          ret
    endp
    end 
    0
  18. sam3000 Messages postés 1226 Statut Membre 144
     
    selon ce programme tu travaille sous DOS avec l'assembleur de borland TASM.
    et il y a des commentaires! quelle partie te pose probleme?

    L'erreur est humaine mais un véritable désastre
    ne peut être qu'informatique.
    0