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
|
format MZ
stack 100h ;taille de la pile = 100h soit 256 octets...
entry icode:start ;où commencer l'execution du programme?
segment icode ;segment de code, icode est un nom choisi arbitrairement
;comme le symbile start et le reste, on peu tou appeler en toto ou pipi si on veu
start:
mov ax,idata ;initialiser ds
mov ds,ax
.loop:
mov ebx,tab ;ebx=tab
call extra:print ;la fonction print est dans un autre segment
;c'est un far call
;les near call sont possibles aussi
in al,60h ;entrer le scancode du clavier
cmp al,1 ;=echap?
jne .loop ;non, alors continuer
mov ax,3 ;sortie de base
int 10h
int 20h
segment extra
print: ;ceci est une procedure,
;tu peu chercher le endp un bon moment, il y est pas
push esi edi eax ebx ecx edx es
mov ax,0b800h ;l'ecran texte commence au segment 0b800h
mov es,ax ;utiliser es pour pointer dans l'ecran
add ebx,4 ;l'index des données a afficher
mov edi,[ebx-4] ;charger le curseur texte
xor esi,esi ;pointeur de la chaine de caracteres = 0
mov ah,51h ;attributs de couleur = 51h, violet derriere, bleu devant
.s:
mov al,[ebx+esi] ;charger un caractere
or al,al ;le caractere = 0?
je .e ;bein ouais, alors on sort
cmp edi,160*50 ;on est en bas de l'ecran?
jl @f ;oui alors on reset le pointeur de l'ecran
xor edi,edi
@@:
mov [es:edi],ax ;on transfere le caractere complet dans la memoire texte
add edi,2 ; Pointeur Ecran + 2 taille d'un pixel en octet
inc esi ;pointeur chaine +1 taille d'un caractere texte en octet
jmp .s
.e:
mov [ebx-4],edi ;sauver le curseur ecran
pop es edx ecx ebx eax edi esi
retf ;retour depuis un autre segment
segment idata
tab: ;ceci est la zone de données pointée par DS
.ptr dd 0 ;ici sera stocké le pointeur ecran
db 'heu heu heu heu euuuheufh dfheuhudehu ehuhd hudehue hdu hduehu',0 |
Partager