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

x86 16-bits Assembleur Discussion :

Problème en provoquant l'overflow!


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Problème en provoquant l'overflow!
    Bonjour tout le monde je suis en train d'apprendre le langage assembleur et je suis fasse à un problème que je trouve assez bizarre!
    Je vous explique mon programme :
    • Je crée une procédure qui sauvegarde l'adresse ip et cs de la routine de l’interruption 4
    • Je crée une routine qui affiche un message d'erreur s'il y a une erreur d'overflow
    • Je crée une procédure qui affiche un message
    • Je crée une procédure qui fait la somme
    • Je crée une procédure qui restaure l'état de la routine de l'int 4

    Quand je lance le main (start) et en mettant x et y à FFFF pour provoquer un overflow en les sommant, le programme se bloque.
    Voici le programme :
    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
    Pile SEGMENT stack 
    	dw 256 dup(?)
    	jeton label word 
    Pile ENDS 
     
    Data SEGMENT 
    	ancien_ip dw ?
    	ancien_cs dw ?
    	msg_1 db "LE PROCESSEUR SIGNAL UN ETAT D'OVERFLOW$"
    	msg_2 db "OPERATION EFFECTUE SANS ERREUR D'OVERFLOW$"
    	x dw 0FFFFh
    	y dw 0FFFFh
    Data ENDS 
     
    Code SEGMENT
    	assume cs:Code, ds:Data, ss:Pile
     
    	ReadAdd proc near 
    		mov ah, 35h
    		mov al, 04h
    		int 21h
    		mov ancien_ip, bx
    		mov ancien_cs, es
    		ret
    	ReadAdd ENDP 
     
    	Routine:
    	    mov ax, Data
    		mov ds, ax
    		lea dx, msg_1
            mov ah, 09h
            int 21h
    		mov ah, 01h
    		int 21h
    		iret
     
    	Deroute proc near
    		mov ax, Data
    		mov ds, ax
    		lea dx, Routine
    		mov al, 04h
    		mov ah, 25h
    	    int 21h
    		ret
    	Deroute ENDP
     
    	PrintMsg2 proc near
    		mov ax, Data
    		mov ds, ax
    		lea dx, msg_2
    		mov ah, 09h
    		int 21h
    		ret
    	PrintMsg2 ENDP
     
    	Somme proc near
    		mov ax, Data
    		mov ds, ax
    		mov ax, x
    		mov bx, y
    		add ax,bx
    		ret
    	Somme ENDP
     
    	Restore proc near
    		mov dx, ancien_ip
    		mov bx, ancien_cs
    		mov ds, bx
    		mov al, 04h
    		mov ah, 25h
    		int 21h
    		ret
    	Restore ENDP
     
    	debut :mov ax,Data
    		mov ds,ax
    		mov ax,Pile
    		mov ss,ax
    		mov sp,jeton
     
    		call ReadAdd
    		call Deroute
    		call Somme
     
    		int 04h  
    		jo msg
    		call PrintMsg2
    	msg:call Restore
    		mov ax, 4c00h ; exit to operating system.
    		int 21h
     
    ENDS	
    END debut
    Merci d'avance!

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    les routines d'interruptions, pouvant être executées n'importe quand, se doivent de sauver le contenu des registres qu'elle utilise.

    surtout si les registres en question sont des registres de segment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Routine:
    	    mov ax, Data
    		mov ds, ax
    		lea dx, msg_1
            mov ah, 09h
            int 21h
    		mov ah, 01h
    		int 21h
    		iret
    une des erreur, c'est l'absence de push ds, pop ds autours de la routine.

    les registes d'ordre general aussi se doivent d'etre sauvés, pour la simple raison que si l'interruption à lieu au beau milieu de l'utilisation de ces registres, la routine va les detruire, et donc, fausser le programme.

    donc, la routine doit ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Routine:
        push ax dx ds
    	    mov ax, Data
    		mov ds, ax
    		lea dx, msg_1
            mov ah, 09h
            int 21h
    		mov ah, 01h
    		int 21h
        pop ds dx ax           
    		iret
    après cette correction, s'il y a encore une erreur, ça veu dire qu'il y a un aute probleme dans une autre partie du code. j'ai pas tout lu, j'ai posté ce qui me sautait aux yeux.

Discussions similaires

  1. Probleme provoquant un Overflow
    Par 1abdou1 dans le forum Assembleur
    Réponses: 2
    Dernier message: 07/05/2013, 21h11
  2. Problème dans un buffer overflow intentionnel.
    Par Tibapbedoum dans le forum C
    Réponses: 13
    Dernier message: 04/06/2010, 19h07
  3. [CSS] problème d'overflow
    Par Muushi dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 27/06/2006, 15h06
  4. Problème avec Overflow:auto sur Firefox.
    Par psychoBob dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 23/05/2006, 16h46
  5. Problème de stack overflow
    Par heider dans le forum Langage
    Réponses: 13
    Dernier message: 22/09/2005, 19h50

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