Taille d'une structure masm32

le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009 - 6 janv. 2007 à 11:48
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 7 janv. 2007 à 19:24
Bonjour à tous,
je cherche un moyen pour connaitre la taille d'une structure,mais je sais pas qu'elle commande faut utiliser, sizeof ou lengthof ? ..(dans les 2 cas,j'obtiens pas le bon résultat lol :)

voici comment je procéde
  xor ax,ax 
  add ax,lengthof e_IP
  add ax,lengthof e_UDP
  add ax,lengthof eData 
  mov e_IP.TotalLen,ax
  invoke SetDlgItemText,hWin,IDC_EDT4,offset e_IP.TotalLen

ou alors 
  xor ax,ax
  add ax,sizeof e_IP
  add ax,sizeof e_UDP
  add ax,sizeof eData 
  mov e_IP.TotalLen,ax
  invoke SetDlgItemText,hWin,IDC_EDT4,offset e_IP.TotalLen

merci d'avance pour vos réponses

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 janv. 2007 à 14:29
Dernier param de SetDlgItemText est l'adresse d'une chaine, je ne suis pas certain que ce soit le cas dans ton code.

ciao...
BruNews, MVP VC++
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
6 janv. 2007 à 15:03
Salut,
Il y a effectivement l'erreur du au mauvais paramètre.
Sizeof renvoie la taille en bytes (modifier de l'alignement s'il existe).
lengthof renvoie le nombre de variables (de taille n bytes) constituant la chaîne.
                  ToutEnMasm

                
0
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
6 janv. 2007 à 16:47
si je comprends bien,j'ai juste à mettre la somme dans l'adresse d'une chaine

d'habitude, j'utilise cette variable
.data?
BufferTxt    dd 128  dup (?)
....
je remplis mes structures suivant les valeurs des texbox et à la fin,je fais la somme 
   xor ax,ax
  add ax,sizeof e_IP
  add ax,sizeof e_UDP
  add ax,sizeof eData 
  mov e_IP.TotalLen,ax
  add eax,0FFFFh
  mov BufferTxt,eax
  invoke SetDlgItemText,hWin,IDC_EDT4,offset BufferTxt
  et comme résultat j'obtiens  �1B;�8;�1; dans ma textbox
  et même si sur mon interface, je change les valeurs de ma structure le résultat ne    change pas..depuis 1h30 je m'arrache les cheveux : ) mais je ne trouve pas
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 janv. 2007 à 17:52
eax contient une valeur en binaire, il y a toute chance qu'il y ait des octets 0 dedans et c'est le terminateur d'une chaine.
Il faut transformer le binaire de base 2 vers base 10.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
6 janv. 2007 à 19:47
Salut,
Il faut transformer le nombre en caractères ascii visualisables avec une fonction du genre atodw(masm).
.data
texte db 30 dup ()
.code
invoke atodw,BufferTxt,addr texte
invoke SetDlgItemText,hWin,IDC_EDT4,addr texte
  
Le dw 1444h  deviendra  db 31h,34h,34h,34h,0.
et s'affichera 1444
               ToutEnMasm
0
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
7 janv. 2007 à 17:11
Bonjour à vous 2 et merci pour votre aide c'est sympa

ToutEnMasm,j'ai eu des erreurs avec ton code
.data
texte db 30 dup () <- erreur =  invalid data initializer
.code
invoke atodw,BufferTxt,addr texte<- erreur = error A2136: too many arguments to INVOKE
invoke SetDlgItemText,hWin,IDC_EDT4,addr texte

voici mon nouveau code en m'aidant de vos réponses 
.data?
BufferTxt    dd 30  dup (?)

.code
 mov e_IP.TotalLen,sizeof e_IP
 mov esi,offset e_IP.TotalLen
 invoke dwtoa ,esi,addr BufferTxt
 invoke SetDlgItemText,hWin,IDC_EDT4,offset BufferTxt

comme résultat, j'ai bien des chiffres et plus de petit carré...ouf!..enfin : )
mais le résultat est pas bon

pour bien comprendre mes erreurs et me faire une idée sur la chose, est-ce qu'on peut me faire une petite démo avec une structure qui contient 2 à 3 variables(texte,et chiffre) et le passage du code qui permet d'obtenir la taille correct de cette structure

Merci d'avance  
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 janv. 2007 à 17:51
A quoi rime tout cela en ASM ???
La taille d'une struct doit etre connue à l'assemblage alors te suffit de jeter un oeil sur la struct, la somme des tailles de ses membres est la taille totale et basta. En ASM pas de compilo pour aligner les données correctement à ta place, responsabilité du programmeur est pleine et entière/

Exemple qui montre ce que ferait mauvais programmeur alors qu'il faudrait ajouter un membre WORD pour avoir un align correct de 4. Ici le prog affichera bien 6, ce qui est assurément mauvais je le répète.

.586
.model flat, stdcall
option casemap :none
option prologue:none
option epilogue:none


include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc


includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib


BIDON STRUCT
  x DWORD ?
  y WORD ?
BIDON ENDS


.data


buf            DB    24 dup(0)
szappname      DB    "Taille",0


.code
start:
   ALIGN 4
   mov      ecx, sizeof BIDON
   mov      edx, offset buf
   call     ultoa
   push     0
   push     offset szappname
   push     offset buf
   push     0
   call     MessageBox
  
progEnd:
   push     0
   call     ExitProcess



ultoa PROC   ;  IN: ECX INT32, EDX *psz
   or       ecx, ecx
   jnz      short L1
   lea      eax, [edx+1]
   mov      byte ptr[edx], 48
   mov      byte ptr[eax], cl
   ret      0
 L1:
   mov      [esp-4], edi
   mov      [esp-8], edx
   mov      edi, edx
 L2:
   mov      eax, -858993459
   mul      ecx
   mov      eax, edx
   shr      eax, 3
   mov      edx, ecx
   lea      ecx, [eax+eax*8]
   add      ecx, eax
   sub      edx, ecx
   add      dl, 48
   mov      [edi], dl
   mov      ecx, eax
   inc      edi
   test     eax, eax
   jnz      short L2
   mov      byte ptr[edi], al
   mov      [esp-12], edi
   mov      eax, [esp-8]
 L3:
   dec      edi
   mov      dl, [eax]
   mov      cl, [edi]
   mov      [edi], dl
   mov      [eax], cl
   inc      eax
   cmp      eax, edi
   jb       short L3
   mov      eax, [esp-12]
   mov      edi, [esp-4]
   ret      0
ultoa ENDP


end start

ciao...
BruNews, MVP VC++
0
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
7 janv. 2007 à 18:28
A quoi rime tout cela en ASM ???
je tente de faire un générateur de trame udp,j'ai des textbox sur mon interface pour remplir ma structure,c'est pour cela que je ne connais pas la taille de cette structure à l'avance car elle est vide au départ, enfin bon...merci pour l'exemple du mauvais programmeur
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 janv. 2007 à 19:24
On connait par force la taille d'une structure puisque c'est justement fait pour cela, réserver de la place pour un nombre d'octets sinon ce n'est pas une structure mais une alloc dynamique de mémoire (voir VirtualAlloc).

ciao...
BruNews, MVP VC++
0
Rejoignez-nous