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
|
global main
extern _end ; permet de connaitre la taille de la mémoir utilise
;===========================
section .data
;===========================
monFichier DB 'test',0 ; test est le nom de mon fichier
lf DD 10
mesKO DB "Allocation de mémoire supplémentaire ratée",10
lmesKO DD lmesKO - mesKO
nbCarLu DD 0
nbCarEcrit DD 0
;===========================
section .bss
;===========================
handle resd 1 ; c'est le descripteur de fichier (chemin d'acces poure/s)
; reserve un double
;===========================
section .code
;===========================
main:
mov eax, 5; appel service open
mov ebx, monFichier
mov ecx, 0 ; methode d'ecriture: lire
int 0x80
mov [handle],EAX ; EAX contient apres l'appel systeme le file descriptor
mov ESI,10
mov EDI,_end
MOV EAX,45 ; 45 est l'appel systeme brk
MOV EBX,_end ; qui contient la derniere adresse qu'on utilise
ADD EBX,1000 ; on ajoute 100 bytes sup
INT 0x80
CMP EAX,0 ; on regarde si tout est ok
JGE suiv ; on jump sur read si ok
MOV EAX,4 ; si non ok on affiche un message d'erreur
MOV EBX,1
MOV ECX,mesKO
MOV EDX,[lmesKO]
suiv:
MOV EAX,19 ; 19 corespont à l'appel systeme LSEEK
MOV EBX,[handle]
MOV ECX,ESI ; ESI = 10 (10 est mon offset (déplacement))
MOV EDX,0
INT 0x80
cmp EAX,-1 ; on regarde si il est a la fin du fichier
je fini
mov eax,3 ;appel service read
mov ebx,[handle]
mov ecx,edi
mov edx,1
int 0x80
CMP EAX,0
je fini ; si il donne -1 c'est qu'il a fini
ADD ESI,10
ADD EDI,1
ADD byte [nbCarLu],1 ; on ajoute 1 a ma variable compteur
JMP suiv
fini: MOV EDI,_end
ADD byte[nbCarLu],'0'
; on affiche le compteur du nb de fois qu'il a lu dans le fichier
MOV EAX,4 ; appel systeme pour ecrire
MOV EBX,1
MOV ECX,nbCarLu ; on lui envoi l'adresse de la variable
MOV EDX,1 ; on lui donne la taille logique de la variable
INT 0x80
mov EAX,4; appel service write
mov EBX,1
mov ECX, lf
mov edx, 1
int 0x80
; on affiche le contenue de la memoire dynamique
mov EAX,4 ; appel service write
mov EBX,1
mov ECX,edi
mov EDX, [nbCarLu]
int 0x80
; on nettoye
MOV EAX,45 ; service break
MOV EBX,_end
INT 0x80
; on termine
MOV eax,1
MOV ebx,0
INT 0x80 |
Partager