Question/Réponse (aimez-vous le chou ? [o/n])
Introduction
Le programme doit poser une question (aimez-vous le chou ? [o/n]).
L'utilisateur doit répondre 'o' pour oui ou 'n' pour non.
Selon la réponse, le programme fait un petit commentaire !
Version 1 - Question basique
Ecrivez le programme question.asm suivant
section .data
question db 'Aimez-vous le chou ? [o/n] ', 0
question_len equ $-question
like_message db 'moi aussi', 10 ; Message si la réponse est 'o'
like_len equ $-like_message
dislike_message db 'vous avez tort !', 10 ; Message si la réponse est 'n'
dislike_len equ $-dislike_message
section .bss
response resb 2 ; Réserve 2 octets pour la réponse (caractère + newline)
section .text
global _start
_start:
; Afficher la question
mov rax, 4
mov rdi, 1
mov rsi, question
mov rdx, question_len
syscall
; Lire la réponse de l'utilisateur
mov rax, 3
mov rdi, 0
mov rsi, response
mov rdx, 2
syscall
; Vérifier si la réponse est 'o' ou 'n'
cmp byte [response], 'o'
je like_response
cmp byte [response], 'n'
je dislike_response
; Si la réponse n'est ni 'o' ni 'n', terminer le programme
jmp exit
like_response:
; Afficher 'moi aussi'
mov rax, 4
mov rdi, 1
mov rsi, like_message
mov rdx, like_len
syscall
jmp exit
dislike_response:
; Afficher 'vous avez tort !'
mov rax, 4
mov rdi, 1
mov rsi, dislike_message
mov rdx, dislike_len
syscall
jmp exit
exit:
; Terminer le programme
mov rax, 1
xor rdi, rdi
syscall
Assembler
nasm -f elf64 question.asm -o question.o
Linker
ld question.o -o question
Lancer le programme
./question
Version 2 - Avec choix par défaut
Nous pouvons également définir un choix par défaut, au cas où l'utilisateur ne ferait que taper sur la touche ENTRER (une 'entrée vide') au lieu d'écrire 'o' ou 'n'.
Considérons que s'il fait cela, cela revient à répondre 'o' (oui).
Cela revient à dire au programme que s'il reçoit le code 10 (nouvelle ligne), il doit exécuter like_response (o)
section .data
question db 'Aimez-vous le chou ? [o/n] ', 0
question_len equ $-question
like_message db 'moi aussi', 10 ; Message si la réponse est 'o' ou entrée vide
like_len equ $-like_message
dislike_message db 'vous avez tort !', 10 ; Message si la réponse est 'n'
dislike_len equ $-dislike_message
section .bss
response resb 2 ; Réserve 2 octets pour la réponse (caractère + newline)
section .text
global _start
_start:
; Afficher la question
mov rax, 4
mov rdi, 1
mov rsi, question
mov rdx, question_len
syscall
; Lire la réponse de l'utilisateur
mov rax, 3
mov rdi, 0
mov rsi, response
mov rdx, 2
syscall
; Vérifier si la réponse est 'o', 'n' ou une entrée vide
cmp byte [response], 'o'
je like_response
cmp byte [response], 'n'
je dislike_response
cmp byte [response], 10 ; Vérifier si la réponse est une entrée vide (newline)
je like_response
; Si la réponse n'est ni 'o', ni 'n', ni une entrée vide, terminer le programme
jmp exit
like_response:
; Afficher 'moi aussi'
mov rax, 4
mov rdi, 1
mov rsi, like_message
mov rdx, like_len
syscall
jmp exit
dislike_response:
; Afficher 'vous avez tort !'
mov rax, 4
mov rdi, 1
mov rsi, dislike_message
mov rdx, dislike_len
syscall
jmp exit
exit:
; Terminer le programme
mov rax, 1
xor rdi, rdi
syscall
Version 3 - Avec gestion de la casse
Nous allons maintenant aller encore un peu plus loin et gérer la casse !
Il faut que si l'utilisateur écrit O en majuscule, le programme le prenne pour un o minuscule.. Idem pour N
Toujours avec l'option par défaut sur o.
section .data
question db 'Aimez-vous le chou ? [o/n] ', 0
question_len equ $-question
like_message db 'moi aussi', 10 ; Message si la réponse est 'o' ou entrée vide
like_len equ $-like_message
dislike_message db 'vous avez tort !', 10 ; Message si la réponse est 'n'
dislike_len equ $-dislike_message
section .bss
response resb 2 ; Réserve 2 octets pour la réponse (caractère + newline)
section .text
global _start
_start:
; Afficher la question
mov rax, 4
mov rdi, 1
mov rsi, question
mov rdx, question_len
syscall
; Lire la réponse de l'utilisateur
mov rax, 3
mov rdi, 0
mov rsi, response
mov rdx, 2
syscall
; Convertir la réponse en minuscule pour gérer la casse
mov al, byte [response]
call tolower
; Vérifier si la réponse est 'o', 'n' ou une entrée vide
cmp al, 'o'
je like_response
cmp al, 'n'
je dislike_response
cmp al, 10 ; Vérifier si la réponse est une entrée vide (newline)
je like_response
; Si la réponse n'est ni 'o', ni 'n', ni une entrée vide, terminer le programme
jmp exit
like_response:
; Afficher 'moi aussi'
mov rax, 4
mov rdi, 1
mov rsi, like_message
mov rdx, like_len
syscall
jmp exit
dislike_response:
; Afficher 'vous avez tort !'
mov rax, 4
mov rdi, 1
mov rsi, dislike_message
mov rdx, dislike_len
syscall
jmp exit
exit:
; Terminer le programme
mov rax, 1
xor rdi, rdi
syscall
tolower:
cmp al, 'A'
jb done
cmp al, 'Z'
ja done
add al, 32
done:
ret
↑ Haut de page