-
Vérifier l'existence d'un fichier ou non
Le but est simple, utiliser l'appel système stat pour vérifier si un fichier existe sur le serveur.
Le programme doit demander à l'utilisateur d'entrer le chemin absolu d'un fichier, puis doit vérifier s'il existe et donner une réponse.- Ecrivez le programme checkfile.asm suivant :
section .data
prompt_msg db 'Entrez le chemin du fichier : ', 0
prompt_len equ $ - prompt_msg
file_exists_msg db 'Le fichier existe.', 10
file_exists_len equ $ - file_exists_msg
file_not_exists_msg db "Le fichier n'existe pas.", 10
file_not_exists_len equ $ - file_not_exists_msg
buffer_size equ 4096 ; Taille du buffer pour lire le chemin du fichier
section .bss
input_path resb buffer_size ; Buffer pour stocker le chemin du fichier
statbuf resb 144 ; Espace réservé pour la structure stat
section .text
global _start
_start:
; Affiche le message de prompt
mov rax, 4 ; syscall number pour 'write'
mov rdi, 1 ; stdout
mov rsi, prompt_msg
mov rdx, prompt_len ; Longueur du message de prompt
syscall
; Lire le chemin du fichier de l'utilisateur
mov rax, 3 ; syscall number pour 'read'
mov rdi, 0 ; stdin
lea rsi, [input_path]
mov rdx, buffer_size ; Nombre maximal de caractères à lire
syscall
; Calculer la longueur de l'entrée et supprimer le caractère de nouvelle ligne
mov rdi, rax ; sauvegarder la longueur lue dans rdi
dec rdi ; ajuster pour le caractère de retour chariot
mov byte [rsi+rdi], 0 ; supprimer le caractère de nouvelle ligne
; Appel de 'stat' pour vérifier si le fichier existe
mov rax, 188 ; syscall number pour 'stat'
lea rdi, [input_path] ; Premier argument : pointeur vers le chemin du fichier
lea rsi, [statbuf] ; Deuxième argument : pointeur vers la structure stat
syscall
; Vérifier si stat a réussi
cmp rax, 0
jne file_not_found
mov rax, 4 ; syscall number pour 'write'
mov rdi, 1 ; stdout
mov rsi, file_exists_msg
mov rdx, file_exists_len ; Longueur du message fichier existe
syscall
jmp exit
file_not_found:
mov rax, 4 ; syscall number pour 'write'
mov rdi, 1 ; stdout
mov rsi, file_not_exists_msg
mov rdx, file_not_exists_len ; Longueur du message fichier non trouvé
syscall
exit:
mov rax, 1 ; syscall number pour 'exit'
xor rdi, rdi ; Code de sortie 0
syscall- Assembler
nasm -f elf64 checkfile.asm
- Linker
ld checkfile.o -o checkfile
- Lancer le programme
./checkfile
Tags : fichier, assembleur, freebsd
-
Commentaires