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 :

[C/ASM GNU] Reprogrammation de scanf : problème de lecture


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club Avatar de Butcher22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Points : 36
    Points
    36
    Par défaut [C/ASM GNU] Reprogrammation de scanf : problème de lecture
    Bonsoir,

    je dois essayer de reprogrammer la fonction scanf, donc voici une première version qui plante lors de l'interruption de lecture dans la fonction mread....

    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
     
    #include <stdio.h>
    #include <inttypes.h>
     
    ssize_t mscanf(const char *,...);
     
    int main()
    {
    	int a = 6;
    	char c = 'c';
    	double d = 12.102;
     
    	printf("sizeof int = %d || sizeof char = %d || sizeof double = %d\n",sizeof(int),sizeof(char),sizeof(double));
     
    	printf("a = %d || c = %c || d = %f\n",a,c,d);
     
    	mscanf("%d",&a);
     
    	printf("a = %d\n", a);
     
    	return 0;
    }
    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
     
    .global mscanf
    .type mscanf, @function
    mscanf:
    	pushq %rbp
    	movq %rsp, %rbp
    	movq %rdi, %r15								# %r15 = &format [ %d || %f || %c ]
    	movq %rsi, %r14								# %r14 = &var1
    	call parser										# parse &format
    	call mread										# sys_red [ !! ERREUR !!]
    	movq %rbp, %rsp
    	popq %rbp
    	ret
     
    .global parser
    .type parser, @function
    parser:
    	pushq %rbp
    	movq %rsp, %rbp
    	movq %r15, %rcx								# %rcx = &format
    parser_loop:
    	movb (%rcx), %al
    	cmp $32, %al									# case : espace
    	je parser_next								# incq %rcx
    	cmp $37, %al									# case : %
    	je parser_next								# incq %rcx
    	cmp $100, %al									# case : d
    	je int_init										# pour les entiers
    	jmp error											# SINON ERREUR
    int_init:												# %rdx = taille = 4
    	movq $4, %rdx
    	jmp parser_end
    char_init:											# %rdx = taille = 1
    	movq $1, %rdx
    	jmp parser_end
    double_init:										# %rdx = taille = 8
    	movq $8, %rdx
    	jmp parser_end
    error:
    	pushq $1											# on quitte avec une erreur
    	call exit
    parser_next:
    	incq %rcx											# %rcx = &format + 1 (plutot 8 ?)
    	jmp parser_loop
    parser_end:
    	movq %rbp, %rsp
    	popq %rbp
    	ret
     
    .global mread
    .type mread, @function
    mread:												# %rdxja initialisé
    	pushq %rbp
    	movq %rsp, %rbp
    	movq $3, %rax								# sys_print
    	movq $0, %rbx								# stdin
    	movq %r14, %rcx							# %rcx = &var1
    	int $0x80										# interruption
    	movq %rbp, %rsp
    	pop %rbp
    	ret
     
    .global mprint
    .type mprint, @function
    mprint:
    	pushq %rbp
    	movq %rsp, %rbp
    	movq $4,	%rax							# sys_read
    	movq $1, %rbx								# stdout
    	movq $9, %rdx								# taille
    	movq %r15, %rcx							# &msg
    	int $0x80										# interruption
    	movq %rbp, %rsp
    	popq %rbp
    	ret
     
    .global exit
    .type exit, @function
    exit:
    	pushq %rbp
    	movq %rsp, %rbp
    	movq 16(%rbp), %rbx
    	movq $1, %rax
    	int $0x80											# interruption
    	ret          									# ne doit pas s'exec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    myScanf:	myScanfA myScanfC
    			gcc -gstabs -o myScanf myScanfA.o myScanfC.o
     
    myScanfA: 	myScanf.s
    			gcc -g -c -o myScanfA.o myScanf.s
     
    myScanfC: 	myScanf.c
    			gcc -g -c -o myScanfC.o myScanf.c
     
    clean:
    			rm myScanf myScanfC.o myScanfA.o || echo true

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    :$./myScanf 
    sizeof int = 4 || sizeof char = 1 || sizeof double = 8
    a = 6 || c = c || d = 12.102000
    5
    a = 6
    :$ 5
    bash: 5 : commande introuvable
    Merci d'avance

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    L'interruption 0x80 n'est prévue que pour des systèmes 32 bits, et il faut se tourner sur l'instruction "sysenter" pour du 64 bit, cf http://stackoverflow.com/questions/2...n-64-bit-linux.

    Ensuite, je recommande fortement l'utilisation de gdb qui t'indiquera sur quelle instruction exacte le programme crash, et te permettra aussi d'examiner l'état de tes registres/pile.

    Enfin, la syntaxe AT&T de GNU as est toujours aussi ignoble
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

Discussions similaires

  1. [C/ASM GNU] Utilisation de la pile
    Par Butcher22 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 22/02/2017, 18h51
  2. convertir de l'asm gnu en windows 16 ou 32 bits
    Par Linquisiteur dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 10/05/2013, 18h11
  3. [scanf] problème de programme qui boucle
    Par dr4g0n dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 22/01/2008, 10h48
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

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