2017-05-31 10 views
-4

C'est une question sur laquelle j'ai vraiment besoin d'aide, j'écris actuellement un OS dans l'assemblage FASM et ai une sortie décente avec des icônes provenant de la table ASCII. Je veux savoir si vous pouvez avoir des images sur votre programme d'assemblage. Je ne pouvais pas trouver un site web donc un lien vers un site Web qui peut aider serait parfait, ou non si ce n'est pas possible.Comment mettre des bitmaps ou n'importe quel format d'image dans un programme d'assemblage

+0

Vraiment? J'ai déjà recommandé que vous regardiez http://osdev.org. Cela explique très clairement cela. Vous devez apprendre à créer et gérer un tampon de trame. –

+0

osdev.org ne montre pas comment télécharger des bitmaps vers un fichier d'assemblage dans FASM j'ai regardé mais merci d'avoir répondu. –

Répondre

1

Tout d'abord, vous devez connaître la structure de fichier que vous implémentez.
Vous pouvez le vérifier par exemple sur wikipedia, pour bmp ici: https://en.wikipedia.org/wiki/BMP_file_format
ou ici: http://www.dragonwins.com/domains/getteched/bmp/bmpfileformat.htm - Je préfère utiliser celui-ci
Comme vous le voyez, nous devons mettre en œuvre un peu d'en-tête et alors nous pouvons il suffit de créer le fichier.
permet d'écrire un exemple de code:

File_begin: 
file_header: 
     .bfType: db "BM" 
     .bfSize: dd File_end - File_begin 
     .bfReserved1: dw 0 
     .bfReserved2: dw 0 
     .bfOffBits: dd PIXEL_DATA_START 
image_header: 
     .biSize: dd image_header_end-image_header 
     .biWidth: dd 3 
     .biHeight: dd 3 
     .biPlanes: dw 1 
     .biBitCount: dw 32 
     .biCompression: dd 0 
     .biSizeImage: dd 0 
     .biXPelsPerMeter: dd 0 
     .biYPelsPerMeter: dd 0 
     .biClrUsed: dd 0 
     .biClrImportant: dd 16 
image_header_end: 


PIXEL_DATA_START: 
dd 0x00000000, 0x00000000, 0x00000000 
dd 0x00ffffff, 0x00ffffff, 0x00000000 
dd 0x00ffffff, 0x00000000, 0x00ffffff 

File_end: 

Ce fichier BMP vraiment simple qui affiche un symbole de planeur 3x3.
Comme vous pouvez le voir, le format de fichier BMP est très simple à mettre en œuvre. Reportez-vous simplement à la documentation à laquelle je suis relié si vous avez besoin d'explications sur l'un des champs. Une chose à garder à l'esprit est que vous devez définir des octets dans l'ordre inverse, car les choses sont peu endian dans l'architecture PC.

Mon code est compilé avec FASM et s'exécute sur toutes les plates-formes car il ne s'agit que d'une image - pas de tâches de processeur du tout. Donc, pour répondre à votre question, cherchez le format de l'en-tête du fichier, puis mettez-le en place. La même technique fonctionne avec tout ce que vous faites dans l'assemblage, de sorte que le fichier ressemble exactement de la même manière dans une source de système d'exploitation normale.
Après avoir créé ou parsent tel fichier, vous devez écrire chaque pixel à l'framebuffer en utilisant la formule suivante:
adresse pixel = adresse framebuffer + pixelX * colorDepth + pixely * ScreenWidth * ColorDepth
par exemple:

mov eax, [framebuffer_addr] 
add eax, pixelX * cDepth ; simplified code, in normal circumstances you will have to muliply it first 
add eax, pixelY * cDepth * scrWidth 
mov [eax], 0x00ff0000 ;; this will paint your desired pixel red 

Traitez chaque pixel de l'image et écrivez-le dans le framebuffer et vous avez terminé.