IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

[Débutante] Compréhension programme - mode debug


Sujet :

Assembleur

  1. #1
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut [Débutante] Compréhension programme - mode debug
    bonjour
    voici un programe j'essaye de le comprendre mais j'ai quelque difficulté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    .model small
    .code
           mov cl,0
           ; 1- Interruption 21h Fonction 35h. Lire le vecteur d'interruption
           mov ah,35h ; AH = Numéro de la fonction
           mov al,1ch  ; AL = Numéro du vecteur lu
           int 21h       ; ES:BX contient le vecteur recherché (SEGMENT et OFFSET)
    a quoi sert les 3 dernières lignes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           ; Interruption 21h Fonction 25h. Modifier un vecteur d'interruption
           mov ax,seg spit1C
    seg spit1C c'est quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     mov ds,ax           ;Adresse du nouveau vecteur à installer
           mov dx,offset spit1C ; DS DX (SEGMENT et OFFSET)
           mov ax,251Ch; AH=25h et AL=numéro du vecteur
           int 21h
    ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
           ; Attente 10 secondes
    attente:
           cmp cl,182
           jb attente    
           ;Remise du système dans l'état initial
           mov ax,es  ;
           mov ds,ax
           mov dx,bx
           mov ax,251Ch
           int 21h
           mov ah,4ch
           int 21h
     
    spit1C proc ; Sous-programme d'interruption
           add cl,1
          iret ; se termine par iret
    endp
    end
    Merci pour votre aide

  2. #2
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    Salut,

    le but de ton programme est de faire une pause grace a l'interruption 1Ch (l'int 1Ch corrêspond a l'irq du timer et intervient 18.2 fois par secondes)

    la premiere etape (fct 35h int 21h) permet de connaitre l'adresse de la procedure executé par l'interruption 1Ch

    seg Split1C : j'avais jammais vu ca mais par deduction, ca permet de connaitre le segment dans lequel se trouve l'etiquette Split1C

    ensuite on a DSX qui pointe vert la procedure Split1C
    la fct 25h permet d'attribuer cette adresse a la l'int 1Ch
    une fois cette interruption executé c'est le code qui se trouve a "Split1C" qui sera executé 18.2 fois par seconde

    ensuite si cl = 182, on a une pause de 182/18.2 = 10 secondes

    Rmq: le defaut du programme est de touché aux registres pendant l'int 1Ch qui peut intervenir n'inporte quand. pour un example simple comme celui-ci, il y a peu de chance de creer des problemes mais c une tres mauvaise habitude. Il vaut mieux changer des variables memoires et ne pas oublier un puha/popa dans l'int

    A+ et bonnes fetes a tous

  3. #3
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    merci pour tes explications

    alors les premières lignes pointent vers la procédure "Split1C" mais cette proédure n'ai pas Split1C

    dc il y a deux procédures

  4. #4
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    les premiere lignes pointent vers l'anciennent procedure executée par 1Ch avant l'execution du programme, donc on sauvegarde l'adr de cette procedure pour pouvoir la restaurer une fois le programme terminé (juste apres la boucle de temporisation)

    BonDev'
    A+

  5. #5
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    je reviens avec mes question

    pourrais tu m'éclairer ici
    ES:BX contient le vecteur recherché (SEGMENT et OFFSET)
    *

    ES:BX sont des registres , des vecteurs ?

  6. #6
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    ES et BX sont bien des registres, pour stocké l'adresse d'une fonction en mode reel il faut connaitre sont segment (ES) et l'offset dans le segment (BX)

    ca se note ES:BX ( et je crois qu'on appele ca un vecteur mais tu me fais douter...)

    A++
    TangiX

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 963
    Points : 59 642
    Points
    59 642
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par TangiX
    ca se note ES:BX
    Petite précision : pour faire référence à l'adresse stockée dans le couple ES:BX, l'assembleur, lui, attend la notation ES:[BX]

  8. #8
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    je commence tt doucement a comprendre le programe je suis a ce niveau
    ici il remet tt a zero ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     mov ax,es  ;
           mov ds,ax
           mov dx,bx
           mov ax,251Ch
    int 21h
    ici il arrete le programme

  9. #9
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    une autre question quel interet initialisé a la fin le programme ?

    j'ai une autre question
    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 represente TF ?


    Ps: j'ai vraiment du mal avec assembleur dsl pour mes questions

  10. #10
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 963
    Points : 59 642
    Points
    59 642
    Billets dans le blog
    2
    Par défaut
    Le Trap Flag est utilisé pour le débogage d'un code, pour générer une interruption (du debugger) après chaque instruction exécutée.

  11. #11
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    merci pour cette précision dans la suite
    Exercice n°2 Mini debuggeur:
    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.

    Le programme suivant permet de mettre à 1 le bit TF
    pushf
    pop ax
    or ax,100h
    push ax
    popf
    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)
    je comprends pas trop ce qu'il faut faire ici
    - 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)

    Ps: cet exercice n'est pas un exercice a rendre , j'ai la correction mais comme je comprends pas j'a dc decide de le refaire point par point

  12. #12
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 963
    Points : 59 642
    Points
    59 642
    Billets dans le blog
    2
    Par défaut
    En gros, tu dois écrire deux modules distincts :

    * Un programme de test ("tâche principale"), qui passe en mode debug, assigne des valeurs à cl, ch, dl et dh et qui repasse en mode normal.

    * Une interruption (qui sera appelée après chacune des instructions du programme ci-dessus).
    Cette interruption contient trois procédures :
    1. Affichage de tous les bits d'un registre 8 bits (procédure déjà faite, si je comprends bien);
    2. Affichage d'un espace;
    3. Saut à la ligne.

    A chaque appel de l'interruption :
    1. Afficher valeur de cl à l'aide de la procédure 1
    2. Affichage d'un espace à l'aide de la procédure 2
    3. Afficher valeur de ch à l'aide de la procédure 1
    4. Affichage d'un espace à l'aide de la procédure 2
    5. Afficher valeur de dl à l'aide de la procédure 1
    6. Affichage d'un espace à l'aide de la procédure 2
    7. Afficher valeur de dh à l'aide de la procédure 1
    8. Retour à la ligne à l'aide de la procédure 3

    En supposant qu'au début du programme de test, tous les registres sont à 00h, à l'exécution tu devrais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    00000001 00000000 00000000 00000000
    00000001 00000010 00000000 00000000
    00000001 00000010 00000011 00000000
    00000001 00000010 00000011 00000100

  13. #13
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    En gros, tu dois écrire deux modules distincts :
    * Un programme de test ("tâche principale"), qui passe en mode debug, assigne des valeurs à cl, ch, dl et dh et qui repasse en mode normal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mov ch,1 ; Programme à débugger
           mov cl,2
           mov dh,3
           mov dl,4
    * Une interruption (qui sera appelée après chacune des instructions du programme ci-dessus).
    Cette interruption contient trois procédures :
    1. Affichage de tous les bits d'un registre 8 bits (procédure déjà faite, si je comprends bien);
    2. Affichage d'un espace;
    3. Saut à la ligne.
    moi aussi je comprends que la procédure mais je n'ai que ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    .model small
    .code
           mov cl,0
           ; 1- Interruption 21h Fonction 35h. Lire le vecteur d'interruption
           mov ah,35h ; AH = Numéro de la fonction
           mov al,1ch  ; AL = Numéro du vecteur lu
           int 21h       ; ES:BX contient le vecteur recherché (SEGMENT et OFFSET)
           ; Interruption 21h Fonction 25h. Modifier un vecteur d'interruption
           mov ax,seg spit1C
           mov ds,ax           ;Adresse du nouveau vecteur à installer
           mov dx,offset spit1C ; DS DX (SEGMENT et OFFSET)
           mov ax,251Ch; AH=25h et AL=numéro du vecteur
           int 21h
           ; Attente 10 secondes
    attente:
           cmp cl,182
           jb attente    
           ;Remise du système dans l'état initial
           mov ax,es  ;
           mov ds,ax
           mov dx,bx
           mov ax,251Ch
           int 21h
           mov ah,4ch
           int 21h
     
    spit1C proc ; Sous-programme d'interruption
           add cl,1
          iret ; se termine par iret
    endp
    end

  14. #14
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 963
    Points : 59 642
    Points
    59 642
    Billets dans le blog
    2
    Par défaut
    Tu peux appliquer ce principe de détournement d'une interruption à l'installation de ta propre interruption à la place de l'IRQ 1 (interruption clavier 09h). Attention toutefois, dans le code de ton interruption perso, avant le iret, d'exécuter les instructions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov al,20h
    out 20h,al
    Donc, tu peux tout-à-fait reprendre le début et la fin du programme ci-dessus. A la place de l'attente de 10 secondes, tu passes en mode debug, tu exécutes les quatre instructions de test et tu repasses en mode normal.

  15. #15
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par bolo
    une autre question quel interet initialisé a la fin le programme ?
    Je reviens en arrière puisque je n'ai pas vu de reponse
    A la fin ce n'est pas une intialisation mais une remise a l'etat d'origine
    on se sert de la fct 25h pour remettre la fct du traitement de l'int qui s'y trouvait precedement (avant l'execution de ton programme)

    sinon il y a un bug :
    puisque ton prog quitte, dos va desallouer la memoire qui etait occupé par ton prog puis va l'allouer a un autre programme qui va recouvrir ton ancienne fonction Split1C or l'int pointe toujours a cet endroit et le code sera incoherant donc il y aura un bug...

    Citation Envoyé par bolo
    Ps: j'ai vraiment du mal avec assembleur dsl pour mes questions
    Ben c le but d'un forum d'entraide ! ne soit pas desolé de faire tourner le forum !!
    A++

Discussions similaires

  1. [débutant] ouvrir un fichier en mode debug
    Par julien.63 dans le forum Débuter
    Réponses: 2
    Dernier message: 06/05/2009, 21h50
  2. Réponses: 7
    Dernier message: 07/03/2009, 11h09
  3. [Débutant]Problème en mode Debug Seulement
    Par biklil dans le forum C++
    Réponses: 30
    Dernier message: 25/10/2007, 21h32
  4. Réponses: 6
    Dernier message: 14/12/2006, 00h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo