Bonjour.
J'aimerais savoir comment prendre en charge les images en ASM. Pour mon OS. Je veut afficher une images BMP par exemple. Au démarrage de celui-ci.
Je n'ai jamais lu de bouquin/livre qui parle de ça.
Merci et au revoir!
Bonjour.
J'aimerais savoir comment prendre en charge les images en ASM. Pour mon OS. Je veut afficher une images BMP par exemple. Au démarrage de celui-ci.
Je n'ai jamais lu de bouquin/livre qui parle de ça.
Merci et au revoir!
Bonjour !
Voici un exemple bien commenté (syntaxe FASM) qui devrait t'aider à comprendre la structure d'un fichier BMP :
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
104
105
106
107
108
109
110
111
112
113
114
115
116 ; ***** INTIALISATIONS (MODE VGA, OUVERTURE FICHIER,...) ***** org 100h .lireBmp: pusha ; es = début de la mémoire vidéo mov ax, 0A000h mov es,ax ; Initialisation du mode 13h mov ax,13h int 10h ; Ouverture du fichier mov ax,3D00h ; ouverture de fichier en lecture seule mov dx,nom_fich ; adresse du nom du fichier int 21h jc fin mov bx,ax ; bx = numéro logique ou handle du fichier ; On se déplace pour récupérer la taille du BITMAPINFOHEADER xor cx,cx mov dx,14 mov ax,4200h ; fonction de modification de pointeur dans un fichier int 21h mov ax,3F00h ; fonction de lecture mov cx,4 ; on lit 4 octets (double word) mov dx,taille_header ; Adresse d'offset du buffer int 21h ; On se déplace pour récupérer la palette xor cx,cx mov edx,14 add edx,[taille_header] mov ax,4200h ; fonction de modification de pointeur dans un fichier int 21h mov ax,3F00h ; fonction de lecture mov cx,1024 ; on lit 4 octets (double word) mov dx,palette ; Adresse d'offset du buffer int 21h ; ***** INITIALISATION DE LA PALETTE DE COULEURS ***** push bx ; Sauvegarde du handle du fichier mov bp,palette ; bp = adresse de la palette xor di,di ; di = offest courant pour le parcours de la palette xor bx,bx ; bx = n° du registre DAC pal: mov ch,[bp+di+1] mov cl,[bp+di] mov dh,[bp+di+2] mov ax,1010h ; Chargement registre DAC int 10h add di,4 inc bx cmp bx,256 ; Dernier registre ? jb pal ; On se déplace au début de l'image pop bx ; Restauration du handle du fichier mov ecx,14 add ecx,[taille_header] add ecx,1024 mov dx,cx shr ecx,16 mov ax,4200h ; fonction de modification de pointeur dans un fichier int 21h ; ***** CHARGEMENT DE L'IMAGE (en commençant par la dernière ligne) ***** mov cx,1 ; lit 1 octet dans le fichier haut: mov [x],0 ; abscisse du point larg: mov ax,3F00h ; fonction de lecture mov dx,coul ; Adresse d'offset du buffer couleur int 21h ; lecture du pixel dans le fichier mov ebp,[x] mov eax,320 mul [y] ; ax = 320 * y add ebp,eax ; bp = x + 320 * y mov al,[coul] ; couleur mov [es:bp],al ; Affichage du pixel inc [x] ; colonne suivante cmp [x],320 ; fin de ligne ? jb larg dec [y] ; ligne précédente jns haut ; continue tant que ligne >= 0 fin: ; fermeture du fichier mov ah,3eh int 21h ; Presser une touche mov ah,01h int 21h ; Retour en mode texte mov ax,0003h int 10h popa ret ; ***** DECLARATION DES DONNEES ***** nom_fich: db 'image.bmp',0 ; chemin du fichier image taille_header dd ? ; taille du BITMAPINFOHEADER palette: times 1024 db 0 ; composantes RVB de la palette coul db ? ; couleur d'un point de l'image x dd 0 ; coordonnée x d'un point de l'image y dd 199 ; coordonnée y d'un point de l'image
J'ajoute juste pour Pascal.Alain.B que tu as du remarquer que l'interruption 21h est utilisé, donc tu ne pourras faire directement comme ça.
De manière plus générale, tu peux avoir une petit cours sur le format d'image BMP ici (les sources sont en delphi, mais le principe est là) :
http://delphi.developpez.com/cours/g...ra/bitmap1.php
http://delphi.developpez.com/cours/g...ra/bitmap2.php
http://delphi.developpez.com/cours/g...ra/bitmap3.php
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager