En masm32 coment déclarer un buffet variable

Résolu
papiboff Messages postés 19 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 10 avril 2006 - 4 avril 2006 à 20:14
papiboff Messages postés 19 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 10 avril 2006 - 7 avril 2006 à 01:05
j'ai fait une dll en asm pour lire les images d'une webcam et les additionner (aque moi j'ai que 15 jours d'asm en gros quoi)
je donne à ma dll le width et le height de limage
ben comment déclarer le buffet avec le width et le height de limage

.data? --> en lecture dd pour 200x150 en Fixe
rsom db 120004 dup (?)
vsom db 120004 dup (?)
bsom db 120004 dup (?)
en buffet variable ? ?? moi pas savoir !..
merci
papi

15 réponses

nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
6 avril 2006 à 20:03
C'est bête car tu aurais pû gràçe à ça t'adapter à tous types de résolution sans changer ton code.
Mais bon, si tu préfère garder ton code portable, tu a choisi la bonne solution.

PS : Met ma réponse en réponse acceptée.
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2006 à 21:38
mov eax, w_size
mov ecx, h_size
shl eax, 2
mul ecx


ET BASTA, le "* SIZEOF DWORD" est fait par 'shl, 2'
nbr octets nécessaires est dans eax.


Ensuite employer VirtualAlloc au lieu de GlobalAlloc qui ne devrait plus servir que pour le clipboard.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 avril 2006 à 13:39
Le buffet ? Tu es sur que tu ne confonds pas avec le buffer ?
0
papiboff Messages postés 19 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 10 avril 2006
5 avril 2006 à 16:33
BJ
Rep: Ben si ; et tu crois que cela me rend moinssss z'intelligent ? .(pour les beuffffs ; oui ! ) (traduc dico ; intelligent = QI, pas intello ou ins-truite)
paqueu à la frappe "un t" ? , "un r" ? , boffffff !.
aque la question du forhum !??? ; c'est avec des amuses gueules ?.(je decode pour les beuffff s ; amuse geule = buffet ??? ..)
ben sûr , si tu fumes la moquette ? ; alors là ; ben sûr , un "t"ou un"r" , c'est important pour la question ? ....... sniffff!.
je me renseigniaise , pour les buffets variables ; auprès de mon menuisier "les buffets variables ; existent"
ben et en asm ? (les buffers ben sûr ) .
A+
papi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 avril 2006 à 16:48
Excuse c'est parce que tu t'es quand même trompé 3 fois (j'ai recompté ^^).

Sinon il faut allouer de la mémoire à ton buffer avec une fonction API Win32 (je pense que GlobalAlloc marche).

Si j'ai bien compris, tu veut faire un tableau dynamique comme ça :

WIDTH
/--------------------------------->
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
H | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
E | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
I | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
G | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
H | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
T | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
\/0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

?

Pour ça il faut utiliser (en masm32) ceci :

mov eax, w_size ;Width dans mon dessin
mov ebx, h_size ;Height dans mon dessin
imul eax, ebx
imul eax, SIZEOF DWORD
invoke GlobalAlloc, eax, 0 ;Donne à toutes les cases du tableau la valeur 0
mov mon_pointeur, eax
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2006 à 01:03
pourquoi IMUL, risque de négatif dans les dims du tableau ???
Un seul MUL suffit, inutile d'amuser le processeur.

mov eax, w_size
mov ecx, h_size
shl eax, 2
mul ecx

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
papiboff Messages postés 19 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 10 avril 2006
6 avril 2006 à 08:40
bj
ne t'excuses pas c'est juste pour la rigole
de toutes façons je ne regarde pas ce que j'ecris ; oui , oui
pour GlobalAlloc je va tester
SIZEOF DWORD il sort d'ou ? (pitête en dd je mul par 4?(shl,2))
mais en pur asm ; ya pas !?.(je suis un défenseur du pur asm ; même avec 15j d'asm)
je lis le buffer en linéaire en partant de la fin , paque plus speed
merci t'est un pote pour la rep
a+
papi
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
6 avril 2006 à 18:12
Personnellement, je ne pense pas que ce soit possible en pur asm, mais il faudrait demander à un spécialiste (BruNews t'es encore là ?).

En fait, l'allocation de mémoire est une fonction de l'OS, donc il est impossible de le faire séparèment de l'OS, et donc en pur asm.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2006 à 18:23
C'est bien clair, la mémoire tout comme les périphs c'est l'OS qui gère donc on lui demande.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
6 avril 2006 à 18:27
Le pire c'est que tu demande comment le faire en MASM32, mais que tu veut le faire en pur asm ^^. Le MASM32, c'est justement fait pour pouvoir utiliser toutes les APIs Windows.

La reponse est donc claire : pour déclarer un buffer, il faut absolument le faire en utilisant l'OS et cette ligne :

mov eax, w_size
mov ecx, h_size
shl eax, 2
mul ecx
mov ecx, SIZEOF DWORD
shl eax, 2
mul ecx

invoke GlobalAlloc, eax, 0
mov mon_buffer, eax

Je pense que c'est la reponse définitive, à moins que je n'ai fait une erreur dans mon code asm (copier-coller rapide, pas testé).
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
6 avril 2006 à 18:29
Et en fait, SIZEOF est une macro de MASM qui renvoie la taille en octets du type : pour db, c'est 1, pour dw, c'est 2 et pour dd, c'est 4 je pense.
0
papiboff Messages postés 19 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 10 avril 2006
6 avril 2006 à 20:01
merci ,merci ,merci ,mais z'aime pas wind' os ! et les api
je vais garder le buffer fixe (repos!) ; pour le gâchis de memoire , bofff!
je donnerai au buffer une taille max ; pi vela
a++
papi
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2006 à 20:23
Code portable en ASM, ça n'a aucun sens.

nightlord > pourquoi 2 fois SHL, 1 fois sur le resultat de MUL et basta c'est multiplié par 4.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
6 avril 2006 à 20:57
Euh oui, un copier-coller de ton truc qui a merdé ^^

Je rectifie donc :

mov eax, w_size
mov ecx, h_size
shl eax, 2
mul ecx
mov ecx, SIZEOF DWORD
mul ecx

nvoke GlobalAlloc, eax, 0
mov mon_buffer, eax
0
papiboff Messages postés 19 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 10 avril 2006
7 avril 2006 à 01:05
merci brunew mais j'avais décodé ; ben moi , j'ai ben écrit 3*fois "buffet"
je peux vous dire ! ; il peut le dire?! "c'est triste pour vous d'accepter aussi facilement (pour un langage
aussi puissant) de garder les mains liées par les api et wind' os"
je crois que je ne suis pas fait pour ce monde ASM ?!
a+ plus +++@+++
papi
0
Rejoignez-nous