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