RM50Man
Messages postés314Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention20 août 2006
-
31 oct. 2005 à 20:08
cs_GalactX
Messages postés1Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention 9 novembre 2005
-
9 nov. 2005 à 18:03
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
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 2 nov. 2005 à 09:30
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
RM50Man
Messages postés314Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention20 août 2006 2 nov. 2005 à 11:07
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?
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 2 nov. 2005 à 11:24
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
RM50Man
Messages postés314Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention20 août 2006 2 nov. 2005 à 11:35
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
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 2 nov. 2005 à 12:04
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.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 2 nov. 2005 à 23:59
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.