Assembleur Pile

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. 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
    1. 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
      1. 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
        1. 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
          1. 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
            1. 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. 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
              2. @bolo972oui, 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
            2. à 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
              1. si je veux mettre TF a 0 , j'utilise l'instruction AND

                and ax, 0h ,?
                0
                1. 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
                  1. en fait TF c'est le bit numéro 8
                    dc on ne modifie que celui ci avec
                    and ax,0FEFFh
                    0
                    1. 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
                      1. 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. 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
                      2. 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
                        1. 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
                          1. 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
                            1. 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