Bon bah ce n'est pas super compliqué, ce petit programme assembleur affiche un cadre à l'écran.
Niveau qualité graphique, y'a pas grand chose, c'est pas du code super compliqué mais il a toute fois l'avantage d'être (je pense) bien expliqué et assez simple à lire.
Ce code est destiné surtout au novice de l'ASM et à ceux qui souhaiterais aborder l'aspect graphique en ASM (par graphique, j'entend MODE GRAPHIQUE)...
En espérant que la lecture du code ne soit pas trop compliqué... :S
Bonne lecture ;) et merci pour les commentaires
NOTE : Programmé sous WinXP (pro) en NASM (v. 0.98)
Source / Exemple :
; +--------------------------------------------+
; / ASSEMBLEUR \
; | ------------------ |
; | |
; | par Benjamin DUPLEX (Tripo) |
; | le 25/01/2005 |
; | > benjamin.du@wanadoo.fr |
; | |
; | |
; | * COMPILATEUR : NASM 0.98 |
; | * VERSION : Windows |
; | |
; | * COMPILATION : |
; | nasm Cadre.asm -o Cadre.com |
; | |
; | * LANCEMENT : |
; | Cadre.com |
; | |
; \+--------------------------------------------+/
; NOTE :
; ======
; Pour quitter le programme, vous n'avez qu'à appuyer sur une touche
bits 16 ; programme 16 bits
[ORG 100h] ; commence à l'adresse 0x100 (.com)
[SECTION .data] ; zone de déclarations des constantes
messageQuit db 'Au revoir',13,10,'$' ; msg utilisé lors de la fermeture du programme
[SECTION .text] ; zone de code du programme
CALL .MODE_AFF_MODE_GRAPH ; passage en mode graphique
CALL .CADRE ; affichage du cadre
CALL .TOUCHE ; attente d'une touche
CALL .MODE_AFF_MODE_TEXT ; passage en mode text
MOV DX, messageQuit
CALL .AFFICHAGE_MSG ; affichage du message à l'écran
CALL .QUIT ; quitte le programme
; ------------------------------------------------------------
; FONCTION QUI AFFICHE UN CADRE
; ------------------------------------------------------------
.CADRE:
MOV AL, 90 ; couleur du cadre
; première ligne verticale (à gauche)
MOV BX, 0 ; point de départ
MOV CX, 200 ; point d'arrivé
MOV SI, 0 ; colonne choisie
MOV DX, 0 ; trait vertical
CALL .AFF_TRAIT ; affichage du trait
; deuxième ligne verticale (à droite)
MOV BX, 0 ; point de départ
MOV CX, 200 ; point d'arrivé
MOV SI, 319 ; colonne choisie
MOV DX, 0 ; trait vertical
CALL .AFF_TRAIT ; affichage du trait
; première ligne horizontale (en haut)
MOV BX, 0 ; point de départ
MOV CX, 319 ; point d'arrivé
MOV SI, 0 ; ligne choisie
MOV DX, 1 ; trait horizontal
CALL .AFF_TRAIT ; affichage du trait
; deuxième ligne horizontale (en bas)
MOV BX, 0 ; point de départ
MOV CX, 319 ; point d'arrivé
MOV SI, 199 ; ligne choisie
MOV DX, 1 ; trait horizontal
CALL .AFF_TRAIT ; affichage du trait
RET
; ------------------------------------------------------------
; FONCTION QUI AFFICHE UN TRAIT EN FONCTION DES PARAMETRES
;
; -> BX : point de départ
; -> CX : point d'arrivé
; -> SI : ligne/colonne choisie
; -> DX : vertical/horizontal
;
; APPEL LA FONCTION CONCERNEE SUIVANT DX
; ------------------------------------------------------------
.AFF_TRAIT:
CMP DX, 0 ; on compare DX à 0
JZ .AFF_TRAIT_VERTICAL ; si DX = 0 alors on affiche un trait vertical
JNZ .AFF_TRAIT_HORIZONTAL ; sinon on affiche un trait horizontal
RET
; ------------------------------------------------------------
; FONCTION QUI AFFICHE UN TRAIT VERTICAL EN
; FONCTION DES PARAMETRES
;
; -> BX : point de départ
; -> CX : point d'arrivé
; -> SI : ligne/colonne choisie
; -> DX : vertical/horizontal
;
; ------------------------------------------------------------
.AFF_TRAIT_VERTICAL:
SUB CX, BX ; calcul de la longueur du trait (arrivé - départ)
MOV DX, BX ; on place le curseur au premier point du trait
.BOUCLE_TV:
PUSH CX ; on place la longueur restante à écrire en mémoire
MOV CX, SI ; on met dans DX la colonne choisie
CALL .AFF_POINT ; affichage du point
INC DX ; point suivant
POP CX ; on retire la longueur du trait qu'il reste à écrire de la mémoire
DEC CX ; on la décrémente (car on vient d'écrire un point)
CMP CX, 0 ; on la compare à 0
JNZ .BOUCLE_TV ; si CX <> 0, alors on boucle
RET ; sinon on quitte
; ------------------------------------------------------------
; FONCTION QUI AFFICHE UN TRAIT HORIZONTAL EN
; FONCTION DES PARAMETRES
;
; -> BX : point de départ
; -> CX : point d'arrivé
; -> SI : ligne/colonne choisie
; -> DX : vertical/horizontal
;
; ------------------------------------------------------------
.AFF_TRAIT_HORIZONTAL:
SUB CX, BX ; calcul de la longueur du trait (arrivé - départ)
MOV DX, CX ; met dans DX la valeur de CX
MOV CX, BX ; on place le curseur au premier point du trait
.BOUCLE_TH:
PUSH DX ; on place la longueur restante à écrire en mémoire
MOV DX, SI ; on met dans DX la ligne choisie
CALL .AFF_POINT ; affichage du point
INC CX ; point suivant
POP DX ; on retire la longueur du trait qu'il reste à écrire de la mémoire
DEC DX ; on la décrémente (car on vient d'écrire un point)
CMP DX, 0 ; on la compare à 0
JNZ .BOUCLE_TH ; si DX <> 0, alors on boucle
RET ; sinon on quitte
.AFF_POINT:
MOV AH, 0Ch ; fonction 0Ch
INT 10h ; interruption 10h (BIOS)
RET
; ------------------------------------------------------------
; FONCTION PERMETTANT DE METTRE L'ECRAN EN MODE GRAPHIQUE
; -> 320x200x256
; ------------------------------------------------------------
.MODE_AFF_MODE_GRAPH:
MOV AX, 0013h ; fonction 00h -> sous-fonction 13h (320x200)
INT 10h ; interruption 10h (BIOS)
RET
; ------------------------------------------------------------
; FONCTION PERMETTANT DE METTRE L'ECRAN EN MODE TEXTE
; -> 80x25
; ------------------------------------------------------------
.MODE_AFF_MODE_TEXT:
MOV AX, 0003h ; fonction 00h -> sous-fonction 03h (80x25)
INT 10h ; interruption 10h (BIOS)
RET
; ------------------------------------------------------------
; FONCTION QUI AFFICHE SE QUI SE TROUVE DANS LE REGISTRE
; DX
; ------------------------------------------------------------
.AFFICHAGE_MSG:
MOV AH, 09h ; fonction 09h (affichage d'une chaine de caractère)
INT 21h ; interruption 21h (DOS)
RET
; ------------------------------------------------------------
; FONCTION QUI ATTEND UNE TOUCHE
; ------------------------------------------------------------
.TOUCHE:
MOV AH, 01h ; fonction 01h (lecture d'une touche)
INT 21h ; interruption 21h (DOS)
RET
; ------------------------------------------------------------
; FONCTION QUI REND LA MAIN AU DOS
; ------------------------------------------------------------
.QUIT:
MOV AX, 4C00h ; fonction 4Ch (rend la main au DOS)
; 00h correspond au code 'aucune erreur' et est retourné au programme appelant
INT 21h ; interruption 21h (DOS)
Conclusion :
Je mettrais à jour au fur et à mesure donc n'hésitez surtout pas à critiquer que j'améliore le tout.
Pas encore en ligne, je verrais si je l'ajoute sur mon site (auquel cas j'ajouterais l'URL dans mon profil bien sûr).
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.