J'apprends la programmation avec l'assembleur x86, partie 6
http://www.ctyme.com/intr/int.htm
Le code source de green.asm
; =====
; green
; =====
;
; C:\nasm -fbin green.asm -o green
org 0x100
global main
VGA_MEMORY_SEGMENT equ 0xa000 ; segment mémoire de la carte VGA
VGA_WIDTH equ 320 ; nombre de pixels horizontaux en VGA
VGA_HEIGHT equ 200 ; nombre de pixels verticaux en VGA
section .text
main:
call enter_vga ; on entre dans le mode VGA
call draw_something ; on dessine un truc
call wait_key ; on attend une touche au clavier
call quit_vga ; on quitte le mode VGA
mov ax, 0x4c00 ; on quitte sans erreur
int 0x21
enter_vga:
mov ah, 0x0f ; le service 0x0f de l'int 0x10 récupère le mode vidéo en cours
int 0x10 ; dans al
mov [old_mode], al ; on conserve cette valeur dans old_mode
mov ah, 0x00 ; le service 0x00 de l'int 0x10 change le mode vidéo
mov al, 0x13 ; pour celui de al
int 0x10 ; ici al = 0x13 soit VGA 320x200x256 couleurs
ret
quit_vga:
mov ah, 0x00 ; on restaure le mode vidéo
mov al, [old_mode] ; conservé dans old_mode
int 0x10
ret
wait_key:
mov ah, 0x01 ; le service 0x01 de l'int 0x16
int 0x16 ; vérifie si une touche a été appuyée
jz wait_key ; si ZF est activé, aucune touche n'a été appuyée
ret
draw_something:
mov ax, VGA_MEMORY_SEGMENT
mov es, ax
xor di, di ; es:di = 0xa000:0000 -> début de la mémoire VGA
mov cx, VGA_WIDTH * VGA_HEIGHT ; 320 x 200 = 64000 répétitions
mov al, 0xf0 ; couleur 240 sur 256, un vert kaki
rep stosb ; on remplie l'écran avec les 64000 pixels
ret
section .data
old_mode: db 0 ; variable pour conserver le mode vidéo précédent
Pour m'entrainer
En modifier uniquement la fonction draw_something essayez d'obtenir l'écran suivant :
On affiche des pixels dont la couleur de départ 0 est incrémentée jusqu'à 255, puis retourne à 0, et ainsi de suite.
(si un registre de 8bits valant 255 est incrémenté, il passe de nouveau à 0)