Graphique

Signaler
Messages postés
314
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
20 août 2006
-
Messages postés
1
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
9 novembre 2005
-
Bonjour a tous!!!!
Je veux tracer une ligne mais ca ne marche pas, je passe les parametre par la pile,
et ensuite ds la fonction principale, je remplis le segment es avec le buffer declarer ds data segment!!!
Si quelqu'un voit l'erreur, merci de me prevenir!!

.386
org 100h


dataj segment public
buffer db 64000 dup(0)

dataj ends



debut:


;initialisation du mode graphique 320*200 Graphic 256 couleurs (VGA)
mov ax, 13h
int 10h


mov ax, 0a000h ;Début du segment de mémoire vidéo
mov es, ax


xor di, di


push 10
push 10
push 150


call droite2


mov cx, 64000
mov si, 1
mov di, 1
_remplir:
mov al, buffer[si]
mov es:byte ptr[di], al
inc di
inc si
loop _remplir



mov ah, 00h
int 16h


mov ax, 03h
int 10h



ret


;-------Procedure---------------------


droite2 proc


xor ax, ax
xor bx, bx
xor dx, dx
xor cx, cx


mov bp, sp
mov ax, ss:[bp + 6]
mov dx, ss:[bp + 6]
mov cx, ss:[bp + 6]


push dx
;320 * Y + X
mov dx, ax
shl ax, 8
shl dx, 6
add ax, dx
pop dx
add ax, dx
xor si, si


mov bx, ax
mov si, 0
@remplir:
mov buffer[bx + si], 02h
inc si
loop @remplir;


ret 6


droite2 endp






;-------------Fin procedure---------------



;----------Variable------------------


vert equ 0c0ch



end debut

RM50man

10 réponses

Messages postés
314
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
20 août 2006

C'etait une erreur d' etourderie

mov ax, ss:[bp + 6]
mov dx, ss:[bp + 6]
mov cx, ss:[bp + 6]

au lieu de

mov ax, ss:[bp + 6]
mov dx, ss:[bp + 4]
mov cx, ss:[bp + 2]

Mais si quelqu'un voit comment optimiser ce code, qui me le dise.

RM50man
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
Bonjour,



Pour optimiser ton code tu peux supprimer les

xor ax, ax

xor bx, bx

xor dx, dx

xor cx, cx

au début de droite2 proc



Tu peux aussi éviter de charger le registre dx avec ss:[bp+4] si tu
dois le mettre sur la pile ensuite. Charge le au moment opportun. Tu
peux donc faire:



droite2 proc



mov bp, sp
mov cx, ss:[bp + 2]



;320 * Y + X
mov ax, ss:[bp + 6]
shl ax, 4

;4.Y
add ax, ss:[bp + 6] ;4.Y+Y=5.Y

shl ax, 6
;64.(5.Y)=320.Y

add ax, ss:[bp + 4] ;320.Y+X


Pourquoi charges tu ton buffer de cx octets valant 02h pour recopier
ce dernier dans la mémoire écran ? Tu peux écrire directement dans
cette mémoire



mov di, ax

mov al,02h

rep stosb ;met cx octets de
valeur al dans es:[di] (avec incrémentation de di

;et boucle tant que cx est non
nul)



ret 6


droite2 endp


Bonne prog
Messages postés
314
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
20 août 2006

dataj segment public
buffer db 64000 dup(0)

dataj ends

buff segment public
buffer2 db 64000 dup(0)

buff ends

Est ce que tu sais pourkoi quand je rajoute un segment comme ceci , le compilateur A86 me di Object Overflowsur le buffer 2, ou quand jen rajoute un autre de 64000 ds
dataj ca me fait pareil?

RM50man
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
Je ne suis pas sur de ma réponse car je ne connais pas A86. Peut être
que puisque ton programme est un .com (org100h) la taille des données
doit être limitée à la taille accessible dans un même segment soit 64
K. Ton compilateur rassemble peut-être toutes tes données dans le même
segment et tu dépasses l'espace adressable.



Sais tu quelle est la taille limite à partir de laquelle il te dit des méchancetés ?
Messages postés
314
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
20 août 2006

par ex , si je lui donne la structure d'un exe et que ds le segment data
je rajoute 5 buffer de 64000 i dit rien, mais si je crée un nouveau segment comme l ex dessus et qu eje rajoute plusieurs buffer i me met object overflow

RM50man
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
Comment ton compilateur sait-il si le segment que tu créé est un
segment de données, de programme ou autre ? Je ne suis pas sur que le
fait de mettre des db ou de mettre des déclarations comme

buffer2 db 64000 dup(0)

suffise pour que le compilateur considère que c'est des données.
Peut-être comprend il add ax,00 (il me semble que 00 est l'opcode de
add).



Regarde la syntaxe de déclarations des sections de A86 ; il y a sans
doute une syntaxe plus précise indiquant le type de section (code,
data, bss,...) le partage (private, public), l'alignement etc.

Si tu omets ce paramètre, ton compilateur doit prendre les options par défauts et celà ne te convient peut-être pas.



Je ne peux pas t'apporter beaucoup plus d'aide car je programme
essentiellement en win32 et les problèmes de segments on s'en fiche.
Messages postés
314
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
20 août 2006

En fait, j'ai aucune documentation sur le compilateur A86 et sa synthaxe.

Toi tu dois programmer en masm32, et tu sais comment on fait pour
initialiser l'ecran en mode plein ecran en 800*600.
Quel api on doit appeler?

RM50man
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

un programme tiny (.com) ne peut depasser la taille max d'un registre 16 bits soit 64Ko. un programme exe utilise plusieurs segments et peut donc etre plus grand.

Pourquoi ne pas envisager une allocation dynamique plutot que de bourrer un programme de meme pas 1 ko de code avec 64ko de 0 ?

avec masm32, on utilise les apis windows ou directX.
pour utiliser l'api du bios et vesa, je te conseille le dpmi.

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
autre chose, un tableau a pour index [0..n-1]
Messages postés
1
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
9 novembre 2005

salut tu as oublié de remettre le registre ax à 0

faut faire xor ax, ax avant d'appeler l'interruption 16h du keyboard

bonne prog @++