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 32-bits / 64-bits Assembleur Discussion :

[MASM] récupérer une adresse


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut [MASM] récupérer une adresse
    Bonjour !

    Je cherche à mettre à jour un tableau que je veux trier. Pour cela, je suis amené à récupérer l'adresse d'une case du tableau mais je n'y arrive pas ! Soit j'ai une erreur, soit mon registre contient la valeur de la case du tableau et non son adresse. Une idée ?
    Voici mon code, le programme s'ouvre et se ferme instantanément, en regardant l'état des registres avec un désassembleur, j'ai remarqué que je n'avais pas l'adresse de la case mais sa valeur, d'où ma question.

    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
     
    .386
    .model flat, stdcall
    option casemap : none
     
    include \masm32\include\masm32rt.inc
     
    .data
            array db 2, 5, 6, 3, 7, 1, 2, 8 ;tableau à trier
            array_ok db 1
     
    .code
    start:
     
            mov ebx, 0
     
    		routine:
    			mov array_ok, 1 ;on suppose le tableau trié
     
    			;on vérifie si on se trouve à la fin du tableau, si oui on se place au début (end_of_array)
    			mov eax, lengthof array
    			sub eax, 1
    			cmp ebx, eax
    			je end_of_array
     
    			;si la case actuelle a une valeur supérieur à celle de la case suivante...
    			movzx eax, array[ebx]
    			movzx edx, array[ebx + 1]
    			cmp eax, edx
    			jg changer ;on interverti les valeurs des deux cases
     
    			;sinon si on est à la fin du tableau, on vérifi si il est trié (array_ok = 1)
    			mov eax, lengthof array
    			sub eax, 1
    			cmp ebx, eax 
    			je verif_array
     
    			inc ebx ;si on est pas à la fin, on incrémente ebx et on retourne au début de la routine
    			jmp routine
     
    		changer:
    			;on sauvegarde les valeurs des 2 cases à modifier dans ecx et edx
    			movzx ecx, array[ebx]
    			movzx edx, array[ebx + 1]
     
    			;on enresgistre les adresses des 2 cases à mettre à jour
    			movzx eax, BYTE PTR [array[ebx]]
    			movzx edi, BYTE PTR [array[ebx + 1]]
     
    			;on met à jour les 2 cases
    			mov [eax], edx
    			mov [edi], ecx
     
    			;on a du faire un changement, le tableau n'est donc toujours pas trié -> array_ok = 0
    			mov array_ok, 0
    			inc ebx ;on avance d'une case dans le tableau 
    			jmp routine
     
    		verif_array:
    			;si le tableau est trié (array_ok = 1) on affiche
    			cmp array_ok, 1 
    			je affichage
    			jmp routine
     
    		end_of_array:
    			mov ebx, 0
    			jmp routine
     
            ;--- AFFICHAGE --------------------------------- 
     
            affichage:
            	mov ebx, 0   
     
            	tab:    
                	movzx edx, array[ebx]
                	print str$ (edx), 13, 10
     
                	mov eax, lengthof array
                	sub eax, 1  ;on soustrait 1 de la taille du tableau
     
                	cmp ebx, eax
                	je fin   ;si on arrive à la fin du tableau on quitte la boucle
                	inc ebx  ;sinon on incrémente ebx
                	jmp tab
     
            	fin :
     
            inkey "continuer..."
            exit ;rend la main à l'OS
     
    end start
    merci d'avance !

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Simple,
    mov eax,offset array[ebx]

  3. #3
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut
    et bien c'est ce que j'avais essayé mais quand j'assemble il m'affiche une erreur...

    error A2098: invalid operand for OFFSET

    voici le bout de code dans lequel se trouve mon problème, peut-être cela vous aidera - t - il à y voir plus clair ?

    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
     
    changer:
    	;on sauvegarde les valeurs des 2 cases à modifier dans ecx et edx
    	movzx ecx, array[ebx]
    	movzx edx, array[ebx + 1]
     
    	;on enresgistre les adresses des 2 cases à mettre à jour
    	mov eax, offset array[ebx]
    	mov edi, offset array[ebx + 1]
     
    	;on met à jour les 2 cases
    	mov [eax], edx
    	mov [edi], ecx
     
    	;on a du faire un changement, le tableau n'est donc toujours pas trié -> array_ok = 0
    	mov array_ok, 0
    	inc ebx ;on avance d'une case dans le tableau 
    	jmp routine
    j'ai essayé pas mal de chose mais rien à faire...

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Bon on peut pas gagner à tous les coups.
    Mais une fois sur deux c'est possible.
    Quand offset ne marche pas on utilise lEA (Load Effective Adress)
    lea eax,byte ptr array[ebx]
    Testé et approuvé par windbg
    avec 5 dans ebx,il me sort 1 suivi de 2

  5. #5
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup ça marche !!
    Enfin presque lol, petite chose que je ne comprend pas... en utilisant OllyDbg comme désassembleur pour pour ce qu'il se passe dans mon programme, je me rend compte qu'au moment ou je met à jour les deux cases de mon tableau grâce aux adresse récupérées, la case suivante (ou les deux cases suivantes, mais pas plus) sont mises à 0 ! Je ne comprend pas pourquoi, la valeur devrait être modifiée uniquement à l'adresse donnée !

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ;on sauvegarde les valeurs des 2 cases à modifier dans ecx et edx
    movzx ecx, array[ebx]
    movzx edx, array[ebx + 1]
     
    ;on enresgistre les adresses des 2 cases à mettre à jour
    lea eax, BYTE PTR array[ebx]
    lea edi, BYTE PTR array[ebx + 1]
     
    ;on met à jour les 2 cases
    mov [eax], edx   ;c'est ici que la 1er ou les 2 prochaines cases sont mises à 0
    mov [edi], ecx

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    mov [eax], edx ;c'est ici que la 1er ou les 2 prochaines cases sont mises à 0
    mov [edi], ecx
    Le debugger n'a pas tord.Le mov est mal dimensionner.
    mov [eax],dx ;on met un word a l'adresse = 2 bytes
    mov [eax],dl ;un byte a l'adresse
    mov [eax],edx ;un dword = 4 bytes

  7. #7
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut
    en effet merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2008, 11h23
  2. Réponses: 6
    Dernier message: 12/01/2008, 05h07
  3. Récupérer une adresse MAC sur l'entrée standard
    Par the_ionic dans le forum Réseau
    Réponses: 14
    Dernier message: 20/07/2006, 10h56
  4. récupérer une adresse mac d'un pc distant
    Par Mut dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 03/02/2006, 12h01
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 18h26

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