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 :

Exécution d'interruption détournée


Sujet :

Assembleur

  1. #1
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut Exécution d'interruption détournée
    Salut,

    J'aimerai pouvoir exécuter l'ancien code de l'interruption que j'utilise. je m'explique : j'utilise l'interruption 1Ch (celle de l'horloge donc), mais j'aimerai pouvoir exécuter si il y en avait un l'ancien programme qui utilisait cette interruption avant moi. C'est-à-dire que je ne dois pas empêcher le fonctionnement du programme qui l'utilisait avant moi.

    J'ai déjà récupérer l'ancien vecteur par ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	mov	ah,35h
    	mov	al,1Ch
    	int 	21h
    	mov	eax, 0h
    	mov	ax, es
    	shl	eax, 16
    	mov	ax, bx
    	mov	cs:vecteur, eax
    Je pense qu'il est correcte.

    Ensuite dans mon interruption je fait un : jmp cs:vecteur mais bien sûr ça ne marche pas ! lol

    Si quelqu'un à une idée je suis preneur !

    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Parfois les assembleurs gèrent mal l'instruction jmp far. jmp cs:vecteur peut être interprété comme un saut à l'adresse cs:vecteur. Et non un jmp far à l'adresse contenue dans cs:vecteur. C'est d'ailleurs ambigue, puisque vous déclarez une variable dans votre segment de code ? Pourquoi pas mais enfin... Etes vous certain de la position de votre vecteur ?

  3. #3
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    en fait il s'agit d'en programme résident c'est pour ça que j'ai du mettre la variable dans la portion de code.

    Qu'entendez vous par : Etes vous certain de la position de votre vecteur ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Où est déclaré la variable. Pouvez vous avoir le code désassemblé de votre saut ?

  5. #5
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    voilà tout mon code
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    .model small
    .486
     
    .stack 100h
     
     
    .data
     
     
    .code
    vecteur dd 0
    segVect dw 0
    offVect dw 0
    ECRAN	equ	0b800h
    position dw 0	; position de la balle (entre 0000h et 0F40h)
    caract dw 0	; caractere qui a ete remplace par la balle
    colonne db 0	; colonne de la position de la balle (entre 0 et 80)
    ligne db 0	; ligne de la position de la balle (entre 0 et 21)
    pasX db 2	; pas de deplacement de la balle en X
    pasY db 160	; pas de deplacement de la balle en Y
    cpt db 0	; compteur pour ralentir la balle
     
     
    ; interruption 1Ch
    proc_1Ch:
    	; compteur pour ralentir le deplacement de la balle
    	inc cs:cpt
    	cmp cs:cpt, 10
    	jne fin2
    	mov cs:cpt, 0
     
     
    	; sauvegarde du contexte
    	push ax
    	push di
    	push ds
     
    	; position de la balle
    	mov ax, ECRAN
    	mov ds, ax
    	mov ax, cs:position
    	mov di, ax
     
    	; reaffichage du caractere efface
    	mov ax, cs:caract
    	mov [ds:di], ax
     
     
    	; gestion des bords de l ecran (rebond)
    	cmp cs:colonne, 80	; debordement sur la droite
    	jne VeriB
    	mov cs:pasX, -1
    VeriB:	cmp cs:ligne, 24	; debordement sur le bas
    	jne VeriG
    	mov cs:pasY, -1
     
    VeriG:	cmp cs:colonne, 0	; debordement sur la gauche
    	jne  VeriH
    	mov cs:pasX, 1
    VeriH:	cmp cs:ligne, 0		; debordement sur le haut
    	jne FVerif
    	mov cs:pasY, 1
     
     
    	; mise a jour des informations Ligne/Colonne
    FVerif:	mov al, cs:pasX		
    	add cs:colonne, al
    	mov al, cs:pasY
    	add cs:ligne, al
     
    	; calcul de la position en memoire
    	mov al, cs:ligne
    	and ax, 00ffh
    	imul ax, 160
    	mov bl, cs:colonne
    	and bx, 00ffh
    	shl bx, 1
    	add ax, bx
    	mov di, ax
    	mov cs:position , ax
     
    	; affichage du caractere
    	mov ax, ds:di
    	mov cs:caract, ax
    	mov [ds:di], 0f6fh
     
     
    	pop ds
    	pop di
    	pop ax
     
    fin2:	;jmp cs:vecteur
    	mov ds, cs:segVect
    	mov dx, cs:offVect
    	int 21h
    	int 1ch
    	mov dx, offset proc_1Ch
    	mov ax, 251Ch
    	int 21h
     
    	iret
     
     
     
     
    	public _main
    _main:
    	;sauvegarde du premier caractere
    	mov ax, 0b800h
    	mov ds, ax
    	mov di, 0h
    	mov ax, ds:di
    	mov cs:caract, ax
     
    ;
    ; init du vecteur dIT 1C
    ;
    	push cs
    	pop ds
    	mov dx, offset proc_1Ch
    	mov ax, 251Ch
    	int 21h
     
    ;
    ;recup ancien vecteur
    ;
    	mov	ah,35h
    	mov	al,1Ch
    	int 	21h
    ;	mov	eax, 0h
    ;	mov	ax, es
    ;	shl	eax, 16
    ;	mov	ax, bx
    ;	mov	cs:vecteur, eax
    	mov	cs:segVect, es
    	mov	cs:offVect, bx
     
    	mov ax, ECRAN
    	mov ds, ax
    	mov ax, 6h
    	mov di, ax
     
    	; reaffichage du caractere efface
    	mov eax, cs:vecteur
    	and eax, 000f0000h
    	shr eax, 16
    	add ax, 30h
    	or ax, 0f00h
    	mov [ds:di], ax
     
     
    ;
    ; calcul de la longueur utile
    ;
    	mov dx,offset _main
    	add dx,256
    	shr dx,4
    	inc dx
    	mov ah,31h
    	int 21h
     
    	; quitte le programme
    	mov ax, 4c00h
    	int 21h
     
    end _main

  6. #6
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    Nota bene : le programme résident c'est simplement un caractère qui rebondit sur les bords de l'écran.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Hmm... La variable est donc bien déclarée.

    Est-ce que votre code marche quand il n'y a pas d'appel de l'ancienne interruption ?
    Comment votre assembleur assemble t-il le saut ?

    hum... sinon, je comprends pas du tout la fin2, donc je vais pas trop m'avancer. Je pense que de toute façon, si vous écrivez :

    ce sera assemblé comme un jmp r/m16 et non comme un jmp m16:16. Soit il y a une manière de dire à votre assembleur qu'il s'agit d'un jmp far, soit, il faut que vous écriviez le code à la main. (Opcode : "FF /5")

  8. #8
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    oula, je suis pas spécialiste en asm, lol

    Mais oui, le code marche très bien lorsque je n'appelle pas l'autre interruption.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Hmm... Si c'est l'encodage qui vous pose problème, il suffit de se réferer au manuel d'Intel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       Préfixe       Opcode    Mod|Ext|r/m       Displacement 16
    +------------+------------+------------+-------------------------+
    |    2E      |     FF     | 00 101 110 |      offset vecteur     |
    +------------+------------+------------+-------------------------+
    avec un peu de détail :

    • 2Eh : Préfixe pour cs:
    • FFh : Opcode de jmp far m16:16
    • 00b : Mod pour adressage direct
    • 101b : extenstion d'opcode pour jmp far m16:16
    • 110b : r/m pour adressage direct


    ce qui donnerait en pratique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      db 2Eh, FFh, 2Eh
      dw offset vecteur
    en espérant que je me trompe pas ^^ (un désassemblage sur ce qui a été assemblé le dirait ^^)

  10. #10
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    Le souci c'est qu'il ne reconnait pas le symbol FFh
    Il me marque : Undefined symbol: FFh

  11. #11
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    j'avais oublié qu'il fallait mettre un 0 avant FFh

    déjà le programme ne plante plus, mais il ne fait plus rien non plus, lol

  12. #12
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    En fait, ce qui me gêne surtout, c'est que je fais un jump à une adresse, mais je ne sait même pas si je pars réellement dans un programme d'interruption. Donc si ça se trouve le programme part quelque part et ne revient jamais.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    avec toutes les modifications, je suis un peu perdu. Ne faudrait il pas mettre :

    puisque vous l'utilisez à la place, ainsi qu'intervetir segment et offset dans l'ordre des déclaration ?

  14. #14
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    Désolé, mais je ne peux pas vraiment confirmer, ce n'est que mon 2 TP en x86, alors je ne connais pas encore toutes les subtilités.

    Si je met dw offVect, le programmee ne fait rien et si j'inverse les deux déclarations, le programme reste bloqué comme il le faisait avant avec mon jmp

  15. #15
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    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 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Blustuff
    Soit il y a une manière de dire à votre assembleur qu'il s'agit d'un jmp far
    En MASM, il existe la directive far ptr (similaire à byte ptr)
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  16. #16
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    oui, mais ça ne change rien, apparement le pb vient d'ailleurs

  17. #17
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Toutes ces complications pour rien !!!
    On se demande des fois si certains lisent la doc de leur compilateur...

    C'est pas compliqué :

    -Une façon de faire (avec FASM) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov  word [Vecteur+2], es
    mov  word [Vecteur], bx
    jmp  dword Vecteur
    De toute façon, jmp cs:vecteur 32bits ne peut pas fonctionner car ça signifie un saut à l'intérieur du segment de code !!!
    Or il faut faire un saut extra segment !

    Autre chose : Même avec ça ça ne marchera pas !
    Si tu fais un jmp, l'int pointée va faire un retour dans le vide !
    Il faut faire un call ou alors empiler cs et ip et ensuite faire jmp !!!
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  18. #18
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    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 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    En relisant le code posté, je vois que, dans le programme principal (_main, tu charges l'adresse de la nouvelle interruption dans le vecteur d'interruptions avant de récupérer l'adresse de l'ancienne interruption !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Citation Envoyé par Nico*3-3
    car ça signifie un saut à l'intérieur du segment de code !!!
    cs:Vecteur veut dire que la variable Vecteur est dans le segment de code, pas que le saut va avoir lieu dans ce segment.

    Citation Envoyé par Nico*3-3
    Or il faut faire un saut extra segment !
    D'où l'utilisation de la directive jmp far, dont la syntaxe varie d'un assembleur à l'autre (merci Alcatiz : ) )

    Citation Envoyé par Nico*3-3
    Autre chose : Même avec ça ça ne marchera pas !
    Si tu fais un jmp, l'int pointée va faire un retour dans le vide !
    Il faut faire un call ou alors empiler cs et ip et ensuite faire jmp !!!
    Le retour d'une interuption se fait par iret. L'interruption appellée ne reviendra donc pas par un ret. Le retour serait éronné. jmp far convient bien ici.

  20. #20
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Désolé je ne connais pas bien la syntaxe MASM...

    Par contre, un iret fait à peu près comme un ret, il y a de toutes façons besoin que l'adresse de retour soit empilée...

    Désolé...
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Lazarus] Interruption de l'exécution
    Par cedric190985 dans le forum Lazarus
    Réponses: 6
    Dernier message: 25/02/2010, 00h18
  2. [E-07] Exécution sans interruption d'une macro automatique de sauvegarde
    Par JMVBAExcel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/01/2009, 20h40
  3. Interruption d'exécution de code
    Par Kimado dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 07/05/2007, 17h30
  4. Réponses: 17
    Dernier message: 19/02/2005, 19h36

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