Bonjour,

Je suis débutant en Assembleur et j'aimerais écrire un programme qui lit les caractères qui se trouvent aux positions 10,20,30,... d'un fichier texte fourni et qui mémorise les caractères dans une mémoire dynamique puis ensuite affiche les caractères et le nombre de caractères mémorisés !

Cela est-il bon ?

Voici mon code :

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
 
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