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 :

Quelle erreur ai-je fais ?


Sujet :

Assembleur

  1. #1
    Membre averti
    Quelle erreur ai-je fais ?
    Bonjour,

    J'ai un plantage de code. Après vérification au debugger, il s'arrête sur cette instruction > mov dword [esi],ecx
    Je ne comprend pas pourquoi.

    Voilà la partie du code concerné:

    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
     
     
     
    proc tcpip_hdr src_addr,\
    	       src_port,\
    	       dst_addr,\
    	       dst_port,\
    	       tcp_flags
     
     
    ;-----------[iphdr offset 1]---------------
     
    	xor	ecx,ecx
     
    	mov	ch,ihl
     
    	mov	cl,version
    	shl	cl,4
    	ror	ecx,12
     
    	mov	cl,tos
    	ror	cx,6
     
    	mov	cl,ip_ecn
    	rol	cx,6
    	ror	ecx,8
     
    	mov	cx,tot_len
    	ror	cx,8
    	rol	ecx,16
     
    	mov	dword [esi],ecx
     
    ;------------------------------------------

  2. #2
    Membre confirmé
    comment ça il s'arrête? il y as une erreur ou est ce que le processeur freeze?
    si il y as une erreur sur cette instruction ça doit venir d'une autre partie du code parce que la on n'arrive pas a savoir a quoi corrspond esi

  3. #3
    Membre averti
    Non pas de freeze juste une erreur, celle ci:

    00:00:33 access violation when writing to [00000000]

    Désolé je galère un peu, j'ai repris l'asm après plusieurs années d'arrêt total du coding donc je me questionne sur certaines choses.
    En particulier ce mov dword [esi],ecx, est-ce qu'on a le droit d'écrire ça ? Ca a un sens pour vous ? Ca veut dire quoi exactement ?
    Parce que plus loin dans le programme je continue à empiler sur esi, ça va jusque mov dword [esi+48],ecx
    Vous trouvez ça normal ou bien j'étais défoncé quand j'ai codé ce truc ??

  4. #4
    Expert éminent
    Sur ton code esi n'est pas initialisé ,du coup tu écris sur l'adresse 0 apparemment ,donc un segfault.

  5. #5
    Membre averti
    ok merci

  6. #6
    Membre averti
    Qu'est ce que tu veux dire par "initialiser esi" ?
    Je dois lui adresser une valeur mémoire c'est ça ?

    J'ai fait un mov esi,valeur
    J'ai testé avec plusieurs valeurs différentes mais aucune ne fonctionnent..

  7. #7
    Expert éminent
    Normal , il faut pas lui donné une valeur au pif , mais une adresse (et une adresse valide , donc variable globale , pile , malloc ou autre ).
    Tu ne peux pas lire/écrire n'importe où en mémoire , l'OS te le bloquera (c'est normalement une des bases qu'on apprend en info mais bon :p )

  8. #8
    Membre averti
    Oui je sais qu'on ne peut pas écrire n'importe où en mémoire, mais comment justement déterminer la bonne valeur mémoire, je veux dire, où peut-on écrire en mémoire, comment déterminer cela ?

  9. #9
    Membre averti
    Je suis désolé, j'ai arrêté le coding depuis plusieurs années et j'ai oublié pas mal de choses, du coup j'ai du mal à relire mes codes...

  10. #10
    Responsable Systèmes

    La réponse t'as été donnée, tu dois positionner esi.

    esi doit contenir l'adresse ou tu comptes mettre le contenu de ecx. On ne peut pas savoir pour toi cette adresse, probablement un des paramètres de la fonction, que tu dois donc récupérer sur la pile si mon hypothèse est la bonne.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutor...s/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

###raw>template_hook.ano_emploi###