Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimisation et Débogage d'un Programme Assembleur

    28 juillet 2024 à 22:01:44

    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 :


    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 recupere 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 !
    • Partager sur Facebook
    • Partager sur Twitter
      30 juillet 2024 à 18:00:19

      1. comme dans les autres langages, faire des fonctions 

      2. il me semble que ton COUNTRY_MAX_LENGTH ne soit pas défini (ça aurait du sortir à la compilation)

      -
      Edité par umfred 30 juillet 2024 à 18:00:29

      • Partager sur Facebook
      • Partager sur Twitter
        1 août 2024 à 16:27:59

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

        des fonctions et/ou des macros.

        -
        Edité par michelbillaud 2 août 2024 à 22:17:52

        • Partager sur Facebook
        • Partager sur Twitter
          2 août 2024 à 17:43:15

          Et également bien documenter son code.

          Si on peut le faire:

          + donner les registre en entrée avec leur contenu.

          + Donner les registres en sortie avec leur contenu.

          + Indiquer les registres détruits par la fonction.

          + Adopter des conventions d'utilisation de ses registres.

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

          Optimisation et Débogage d'un Programme Assembleur

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown