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 :

[Débutant] Programme demandant la saisie du nom et du pays de l'utilisateur


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 12
    Points : 16
    Points
    16
    Par défaut [Débutant] Programme demandant la saisie du nom et du pays de l'utilisateur
    Bonjour à tous,

    Je découvre l'assembleur et je réalise de petits exercices pour mieux comprendre comment tout cela fonctionne. J'ai voulu faire un programme en assembleur x64 qui demande à l'utilisateur de saisir son nom et son pays. Cependant, j'ai quelques problèmes avec mon code et je ne suis pas sûr de la manière correcte de gérer plusieurs entrées sans répéter certaines parties du code. Voici mon code actuel :

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    extern GetStdHandle
    extern WriteConsoleA
    extern ReadConsoleA
    extern ExitProcess
     
    STD_OUTPUT_HANDLE equ -11
    STD_INPUT_HANDLE equ -10
    SHADOWSPACE_SIZE equ 32 + 8
    NULL equ 0
     
    section .data
        message_name db "Nom ? ", 0
        MESSAGE_NAME_LENGTH equ $-message_name
        USERNAME_MAX_LENGTH equ 12
        message_country db "Country ? ", 0
        MESSAGE_COUNTRY_LENGTH equ $-message_country
     
     
    section .bss
        written resd 1
        read resd 1
        username resb USERNAME_MAX_LENGTH
        country resb COUNTRY_MAX_LENGTH
     
    section .text
        global main
    main:
        sub rsp, SHADOWSPACE_SIZE
     
        ; Demande de saisie pour le nom
        mov rcx, STD_OUTPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, message_name
        mov r8, MESSAGE_NAME_LENGTH
        mov r9, written
        mov qword [rsp + SHADOWSPACE_SIZE], NULL
        call WriteConsoleA
     
        ; Lecture au clavier pour le nom
        mov rcx, STD_INPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, username
        mov r8, USERNAME_MAX_LENGTH
        mov r9, read
        mov qword [rsp + SHADOWSPACE_SIZE], NULL
        call ReadConsoleA
     
    ask_country:
        ; Demande de saisie pour le pays
        mov rcx, STD_OUTPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, message_country
        mov r8, MESSAGE_COUNTRY_LENGTH
        mov r9, written
        mov qword [rsp + SHADOWSPACE_SIZE], NULL
        call WriteConsoleA
     
        ; Lecture au clavier pour le pays
        mov rcx, STD_INPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, country
        mov r8, COUNTRY_MAX_LENGTH
        mov r9, read
        mov qword [rsp + SHADOWSPACE_SIZE], NULL
        call ReadConsoleA
     
        ; Vérification de la taille du pays
        mov rax, read
        cmp dword [rax], 0
        jge ask_country
     
        ; Affichage du nom
        mov rcx, STD_OUTPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, username
        mov r8, USERNAME_MAX_LENGTH
        mov r9, written
        mov qword [rsp + SHADOWSPACE_SIZE], NULL
        call WriteConsoleA
     
        ; Affichage du retour à la ligne
        mov rcx, STD_OUTPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, newline
        mov r8, 1
        mov r9, written
        mov qword [rsp + SHADOWSPACE_SIZE], NULL
        call WriteConsoleA
     
        ; Affichage du pays
        mov rcx, STD_OUTPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, country
        mov r8, COUNTRY_MAX_LENGTH
        mov r9, written
        mov qword [rsp + SHADOWSPACE_SIZE], NULL
        call WriteConsoleA
     
        add rsp, SHADOWSPACE_SIZE
     
        xor rcx, rcx
        call ExitProcess
    Problèmes rencontrés :

    1. Je répète beaucoup de code pour récupérer et afficher les messages et lire les entrées. Y a-t-il un moyen plus efficace de gérer cela ?

    2. Mon code ne fonctionne pas comme prévu. Par exemple, je ne demande pas du tout le nom du pays.

    Merci d'avance pour votre aide !

  2. #2
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2019
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2019
    Messages : 51
    Points : 86
    Points
    86
    Par défaut
    Bonjour.
    Le programme affiché ne semble pas être la dernière version car il y a des erreurs de compilation pour des variables non déclarées : COUNTRY_MAX_LENGTH et newline.
    Ensuite vous faites une boucle sur la saisie du pays et vous testez la fin sur un nombre de caractères saisi à 0 or cette fonction retourne la valeur 0Dh0Ah sur une saisie vide donc il faut tester l’arrêt sur 2 caractères
    Enfin c'est cette valeur que vous chercher à afficher en final et non pas la valeur précédemment saisie du pays. ET vous devez mettre le nombre de caractères exacts du pays et pas la longeur maxi de la zone.
    Enfin il ne faut pas libérer la place des variables cachées en fin car sinon la fonction exitprocess va planter
    Pour éviter la redondance d'instructions, il suffit de créer des routines que vous appelez en passant les données soit dans les registres rcx, rdx etc soit sur la pile. Mais attention il faut surveiller l'alignement de la pile et la réservation pour les SHADOWSPACE.
    Bon courage.
    Exemple de fonction d'affichage à appeler par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       mov rcx,message_name
       mov rdx,MESSAGE_NAME_LENGTH
       call afficherConsole
    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
    ;rcx contient le message à afficher
    ;rdx la longueur
    afficherConsole:
        enter 8,0                ; prologue reserve 8 octets pour le nombre de caractères
        push rbx                 ; sauve les registres
        push r12
        mov rbx,rcx              ; sauve les entrées
        mov r12,rdx
        sub rsp,SHADOWSPACE_SIZE ; réserve la place
        mov rcx, STD_OUTPUT_HANDLE
        call GetStdHandle
     
        mov rcx, rax
        mov rdx, rbx             ; message à afficher 
        mov r8, r12              ; longueur
        mov r9, rbp              ; adresse nb de caractères affichées
        mov qword [rsp + SHADOWSPACE_SIZE], NULL  ; 5ieme parametre à 0
        call WriteConsoleA
        add rsp,SHADOWSPACE_SIZE    ; réaligne la pile
        pop r12                     ; restaure les registres 
        pop rbx
        leave                       ; epilogue
        ret                         ; retoune à l'appelant

Discussions similaires

  1. Problème requête : elle me demande la saisie de paramètre
    Par bobosh dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/09/2008, 12h05
  2. [BO XI R2 Webi] Filtre avec demande de saisie
    Par eryk71 dans le forum Webi
    Réponses: 11
    Dernier message: 03/01/2008, 12h00
  3. Réponses: 1
    Dernier message: 08/04/2007, 18h59
  4. Demander la saisie d'un booléen
    Par Mr-MAC dans le forum Langage
    Réponses: 4
    Dernier message: 04/10/2006, 16h08

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