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 :

[NASM] Initialisation d'un tableau


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut [NASM] Initialisation d'un tableau
    Bonjour,

    Débutant en ASM x86, je n'arrive pas à initialiser un tableau de 0 à 255. J'ai beau lire de la doc et faire les exemples mais avec un debugger j'ai un beau access violation. Pour tester je n'ai pas fait de boucle, je cherche juste à modifier la première valeur du tableau.Si quelqu'un peut me donner un coup de main. Merci

    NB: J'utilise nasm avec visual studio comme debugger sur un windows 64bits
    Voici mon bout de 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
    global _init_table
     
    %define ARRAY_SIZE 256
     
    SECTION DATA USE32 CLASS=DATA:
    array: times ARRAY_SIZE dw 0 ; reserved an array of 256 bytes
     
    SECTION CODE USE32 CLASS=CODE:
     
    _init_table:
    	push ebp		; add ebp on the stack
    	mov ebp, esp	; move esp in ebp
    	sub esp, 4		; reserved a DWORD for j
    	push ebx		; ebx must not be changed
     
            ; Inutile pour le moment
    	mov dword[ebp - _init_table_PRM_j], 0 	; initialize j to '0'
     
    	db 0xcc	; TO REMOVE WARNING
     
            ; Initialisation de la boucle
    	mov eax, 10
    	mov ebx, array ; Charge l'adresse de array dans ebx
    	mov [ebx], word 10
     
    	; Sortie de fonction
    	pop ebx;
    	mov esp, ebp	; move ebp in esp
    	pop ebp			; pop ebp
    	ret

  2. #2
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut
    Je me suis rendu compte que ce type de déclaration correspondait à un extern en C.

    J'ai modifié mon code et ça a l'air de marcher. Ça vous semble juste ?

    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
    global _init_table
     
    %define ARRAY_SIZE 256
     
    SECTION CODE USE32 CLASS=CODE:
     
    _init_table_PRM_array	equ 512		; words array 2 bytes*256
     
    _init_table:
    	push ebp		; add ebp on the stack
    	mov ebp, esp	; move esp in ebp
    	sub esp, _init_table_PRM_array
     
    	db 0xcc	; TO REMOVE WARNING
     
    	lea ebx, [ebp - _init_table_PRM_array]	; ebp points to ebx
     
    	; initialize the array from '0' to '255'
    	mov cx, 0		; initialize i to '0'
    	mov esi, 0		; data offset
     
    .for_loop:
    	cmp cx, ARRAY_SIZE
    	jge .end_for
    	mov [ebx+esi], cx
    	inc cx
    	add esi, byte 2
    	jmp short .for_loop
     
    .end_for:	
     
    	mov esp, ebp	; move ebp in esp
    	pop ebp			; pop ebp
    	ret

  3. #3
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Pourquoi n'utilises-tu pas l'instruction LOOP cela allégerait ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .for_loop:
    mov  [ebx+esi], cx
    add  esi, byte 2
    loop .for_loop,cx
    EDIT : oups, ton tableau sera rempli de 256 à 1, mais cela peut se régler

  4. #4
    Membre Expert
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Par défaut
    Je réponds à sa place

    Car avec loop, cx est décrémenté.
    Il faudrait donc initialiser cx avec la longueur de la chaine.
    Et du coup, les valeurs stockées dans son tableau seraient décroissantes

    a+ François

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par Forthman Voir le message
    Je réponds à sa place

    Car avec loop, cx est décrémenté.
    Il faudrait donc initialiser cx avec la longueur de la chaine.
    Et du coup, les valeurs stockées dans son tableau seraient décroissantes

    a+ François
    as-tu lu ceci :
    Citation Envoyé par ssmario2
    EDIT : oups, ton tableau sera rempli de 256 à 1, mais cela peut se régler

  6. #6
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    Plusieurs choses:

    Ton cadre de pile est correct mais cela ne suffit pas:

    ebx esi edi sont des registres protégés par convention. Toute routine, procédure… se doit de les retourner dans l'état initial lors de leur entrée.

    (Désolé pour la syntaxe, je n'utilise pas le même outil que toi).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Push ebx,
           esi,
           edi
     
    	...
    Pop edi,
            esi,
            ebx
    Une habitude qui peut t'aider dans pas mal de cas, c'est de mettre à 0 ses trois registres au point d'entrée de ton PE. Tu n'auras plus qu'à vérifier(au debugg) qu'aux retours aux appelants principaux ils sont toujours égaux à 0.

    Tu pourrais initialiser ta table avec des bytes, des word ou des dword et dans ce cas utiliser les instructions de chaînes qui utilisent eax et edi: stos + taille serait une solution plus élégante:

    Edi = Lp -> Table à initialiser (ou plus simplement ton adresse dans la pile, dans ce cas tu peux aussi utiliser le fait que les offsets de ta pile sont négatifs…)

    Eax te sert de compteur (évite ecx loop qui est plus lent que sub ecx taille | jns L1<)

    mov eax 0, edi LpTableTaille_0_255
    ; stosb byte / stosw word / stosd dword
    L1: stosb | add al 1 | jnz L1<

    Tu n'as qu'à protéger edi seulement

    Le fait d'incrémenter eax dans son LSB permet de revenir à 0 après 255
    Les flags étant actualisés par add, si al = 0 c'est que tu as terminé le travail

  7. #7
    Membre Expert
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    as-tu lu ceci :
    Bien non il l'a posté après ma réponse

    a+ François

Discussions similaires

  1. Initialisation d'un tableau de pointeurs
    Par tintin72 dans le forum C++
    Réponses: 19
    Dernier message: 19/11/2006, 10h22
  2. Problème d'initialisation d'un tableau
    Par Premium dans le forum C
    Réponses: 13
    Dernier message: 31/05/2006, 14h48
  3. [NASM] Initialisation palette de couleur
    Par powerpsy dans le forum Assembleur
    Réponses: 6
    Dernier message: 13/04/2006, 15h11
  4. Débutant : initialisation d'un tableau
    Par lebokto dans le forum C++
    Réponses: 7
    Dernier message: 02/11/2005, 15h50
  5. Initialisation d'un tableau de type STRUCT
    Par Axiome dans le forum MFC
    Réponses: 4
    Dernier message: 06/09/2005, 10h58

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