begin process at 2012 05 25 03:53:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

erreur de segmentation


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

erreur de segmentation

lundi 13 décembre 2010 à 14:38:33 | erreur de segmentation

yabusame51

Bonjour,

Voila je débute en language NASM et j'ai un probleme avec un de mes codes

le voici:

global factor
extern printf


section .text
%define p dword [ebp+8]

factor:
push ebp
mov ebp,esp
mov ebx,2; d<=2

while:
mov edx,0
mov eax,p ; mettre p dans eax
div ebx ;p modulo d
cmp edx,0 ; modulo =0 ? edx=resultat modulo
jne sinon

push ebx
call printf
mov ecx,2
mov eax,p ; mettre p dans eax
div ecx ; p/2 eax=p/2 edx=p%2
cmp p,1 ; p!=1
jne while
sinon:
inc ebx ; d++
cmp p,1 ; p!=1
jne while
fin:
mov esp,ebp
pop ebp



et voici le programme en c pour le tester:

#include <stdio.h>
#include <stdlib.h>

extern void factor(int p);

int main (int n, char *arg[]){
int i;
printf("je suis le super programme %s \n",arg[0]);
for (i=1;i<n;i++){
int p=atoi(arg[i]);
printf("arg[%d]=%d\n",i,p);
factor(p);
}
return 0;
}

Lors de la compilation aucun soucis, mais lors de l'execution il me met une erreur de segmentation... etant debutant j'implore votre aide au plus vite :) merci d'avance
lundi 13 décembre 2010 à 19:20:07 | Re : erreur de segmentation

Guilou34

Salut
Il manque un Pop Ebx.
mercredi 15 décembre 2010 à 08:16:21 | Re : erreur de segmentation

yabusame51

Salut, merci pour ton aide. Effectivement il me manque ce Pop ebx, je l'ai rajouté (aprés le call printf).

Mais au moment de retester mon programme plein d'optimisme et de joie à l'idée qu'il fonctionne, ARGH l'erreur est toujours présente
mercredi 15 décembre 2010 à 14:08:31 | Re : erreur de segmentation

Guilou34

Il manque aussi un RET pour revenir au Main.
Amicalement
vendredi 17 décembre 2010 à 03:36:39 | Re : erreur de segmentation

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

Une division par 2 se fait rarement en asm, on préfère généralement décaler les bits vers la droite. (shr)

le flag carry donnera la valeure du bit éjecté. Ceci devrait déjà te simplifier grandement le code.

@++
vendredi 17 décembre 2010 à 03:41:21 | Re : erreur de segmentation

patatalo

Membre Club Administrateur CodeS-SourceS
erreur de segmentation veut dire acces à une zone de memoire non autorisée.

push ebx
call printf
add esp,1*4; pour remettre la pile à sa place.

Je ne vois pas trop non plus comment tu as codé ta fonction printf. C'est la première que je vois prendre un long en unique parametre...

@++
vendredi 17 décembre 2010 à 03:49:07 | Re : erreur de segmentation

patatalo

Membre Club Administrateur CodeS-SourceS
Dernier petit point:

Sous Windows, les fonctions doivent retourner les registres intactes à l'appelant sauf pour eax, ecx et edx. Ce qui veut dire que tu DOIS sauvegarder et restaurer ebx.

@++
vendredi 17 décembre 2010 à 04:02:11 | Re : erreur de segmentation

patatalo

Membre Club Administrateur CodeS-SourceS
Ce n'etait pas la peine de préciser que tu es débutant, ça se voit comme le nez au milieu de la figure. ;-)

Tu verras, l'assembleur ressemble beaucoup au C. Je ne vois pas trop bien non plus ce qu'est censé faire ta fonction factor.
vendredi 17 décembre 2010 à 22:22:17 | Re : erreur de segmentation

Guilou34

Un examen plus approndi montre que l'erreur de segmentation vient d'un mauvais usage de le fonction printf. Celle-ci demande comme arguments l'adresse d'un chaîne de cataractères suivie de la liste des valeurs à imprimer. La chaîne de charactères contient un message éventuel mais surtout le type de chaque valeur.
Le compilateur C connait donc exactement ce qu'il faut empiler avant d'appeler Printf et au retour vide la pile en conséquence.

Voici un example
extern printf ; the C function, to be called

SECTION .data ; Data section, initialized variables

a: dd 5 ; int a=5;
fmt: db "a=%d, eax=%d", 10, 0 ; The printf format, "\n",'0'
SECTION .text ; Code section.

global main ; the standard gcc entry point
main: ; the program label for the entry point
push ebp ; set up stack frame
mov ebp,esp
mov eax, [a] ; put a from store into register
add eax, 2 ; a+2
push eax ; value of a+2
push dword [a] ; value of variable a
push dword fmt ; address of ctrl string
call printf ; Call C function
add esp, 12 ; pop stack 3 push times 4 bytes

mov esp, ebp ; takedown stack frame
pop ebp ; same as "leave" op

mov eax,0 ; normal, no error, return value
ret ; return

Trouvé sur:
http://www.csee.umbc.edu/portal/help/nasm/sample.shtml#printf1

Moi non plus je n'ai pas compris ce que réalise ta fonction et pourquoi utiliser l'assembleur? Si c'est pour une question de vitesse n'est-il pas plus simple d'utiliser l'assemblage en line dans la source C?
Amicalement
samedi 18 décembre 2010 à 05:40:39 | Re : erreur de segmentation

patatalo

Membre Club Administrateur CodeS-SourceS
C'est une fonction printf de type unix. Sous windows, la fonction printf est printf(char *buf, const char *fmt, ...) et '\n' correspond à 10,13. (LF, CR)

Windows ne procedant pas directement à un stdout.

@++


Cette discussion est classée dans : int, erreur, segmentation, arg, factor


Répondre à ce message

Sujets en rapport avec ce message

AT&T erreur de compilation etc... [ par maminovadu75 ] Bonjour, j'aimerais me mettre a l'assembleur mais j'ai quelque problème.voici mon code morceau de code pour trier un tableau de int : ( mélange de C/C Problème de restitution d'une chaîne. [ par Sawteeth ] Bonsoir. Je viens de débuter l'assembleur et j'ai tenté de faire un petit programme qui lit une chaîne au clavier et l'affiche à l'écran. Le problème developpez une routine interruption erreur critique 24h [ par msm_007 ] Salut a tous. je suis débutant ds ce domaine c'est pourquoi je besoin d'aide. je veux reimplementer les routines d'interruption de DOS suivante : Tra Comment utiliser une DLL asm en C++ [ par Neo_Fr ] Salut tt le monde,Je suis tres intereser par le dll suivante: http://www.asmfr.com/code.aspx?ID=23840J'ai besoin de deux fonctions qui sont inclu dans erreur de compilation [ par ggmomo ] Bonjour   Voila je débute en asm et j'ai donc esayer de realiser une horloge en m'inspirant d'une deja existante mais lors de la compilation j'ai des TSR & Détournement d'interrupt(ion) [ par ghuysmans99 ] bonjour à tous.j'ai fait un petit prog en asm 32bits pour dos mais il ne fonctionne pas ... reste à savoir pourquoi !!pourriez-vous m'aider ??;Change afficher un caractère avec int 10h [ par thicdorb ] bonjour à tous,je suis débutant en assembleur et je commence par le début : afficher un caractèrej'utilise l'inteeruption BIOS 10h    mov    al, 'A'   Cherchez l'erreur [ par neo1012 ] Salut, J'ai commencé l'ASM il n'y a pas longtemps, et hier j'ai fait mom premier programme: jmp string code: pop ecx mov bl,1 mov dl,23 ;mov al,4 i Décalage de n bits [ par sniper83 ] Bonjour a tousLa fonction suivante fait un décalage de n bit dans un mot de 64 bits :typedeflong long Word64;< Petit problème pour comparer (cmp) [ par smok1360 ] Bonjour à tous,Pour commencer, j'espère de ne pas avoir choisis le mauvais lieu pour poster, j'ai un petit peu hésité Donc, j'ai décidé d'apprendre l'


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,933 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales