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 !