2. ¸´ÔÓ±äÁ¿µÄÄÚ²¿ÊµÏÖ
ÕâÀïËùÌáµ½µÄ¸´ÔÓ±äÁ¿(ÎÒ×Ô¼ºµÄ½Ð·¨:) )£¬ÊÇָö¾Ù£¬Êý×éºÍ¼Ç¼ÀàÐ͵ıäÁ¿¡£
1) ö¾ÙÀàÐ͵ÄʵÏÖ
Ïȶ¨ÒåÒ»¸öö¾ÙÀàÐÍÈçÏ£º
Enum myweek
sun
mon
tues
wednes
thurs
fri
satur
End Enum
È»ºóÔÙ±àдһ¶ÎʹÓÃö¾ÙÀàÐ͵ĴúÂ룺
Dim a As myweek
Dim b As Integer
a = sun
b = a
Print b
ĬÈÏÉèÖñàÒëÕâ¶Î´úÂ룬½Ó×ÅÎÒÃÇ¿´¿´±àÒëÆ÷Éú³ÉÁËʲô¡£
; 37 : Dim a As myweek
; 38 : Dim b As Integer
; 39 :
; 40 : a = sun
; 41 : b = a
xor ecx, ecx // a = sun ,¼´ a = 0
call DWORD PTR __imp_@__vbaI2I4 // b = a
; 42 : Print b
push eax // b
push esi
push OFFSET FLAT:___vba@006255A0
call DWORD PTR __imp____vbaPrintObj //Print
***************************************************
¿ÉÒÔ¿´³ö£¬Ã¶¾ÙÀàÐÍÔÚ´úÂëÀïÊÇÖ±½ÓÓó£Á¿ÊýÖµ´úÌæµÄ¡£
2) Êý×éÀàÐ͵ÄʵÏÖ
Êý×éµÄ¸ÅÄî±È½Ï¸´ÔÓ£¬ÎªÁËÑо¿·½±ã£¬ÕâÀïÖ»ÌÖÂÛһάÊý×飬²¢ÇÒ²»ÊÇǶÌ׵ġ£
ÏÈ¿´¿´¾²Ì¬Êý×éµÄ¶¨ÒåÓëʵÏÖ¡£
´úÂ룺
Dim a(3 To 6) As Integer
·´»ã±à´úÂ룺
004019FF PUSH 2
00401A01 LEA EAX,DWORD PTR SS:[EBP-2C] // Êý×é±äÁ¿
00401A04 XOR ESI,ESI
00401A06 PUSH ¹¤³Ì1.00401694 // Ö¸Ïò´úÂë¶Î
00401A0B PUSH EAX
00401A0C MOV DWORD PTR SS:[EBP-34],ESI
00401A0F CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryConstruct2>] // ¹¹ÔìÒ»¸öÊý×é
Ö¸Ðе½ÕâÀïʱ¿´[ebp-2c]µÄÄÚÈÝ£º
0063F3E4 01 00 92 00 02 00 00 00 .?...
0063F3EC 00 00 00 00 C0 0F 51 00 ....?Q.
0063F3F4 04 00 00 00 03 00 00 00 ......
ÕâЩÊý¾Ý³ýÁË63F3F0´¦µÄµØÖ·ÊÇ__vbaAryConstruct2º¯ÊýÌî½øÈ¥µÄ£¬ÆäÓàµÄ¶¼ÊÇ´Ó
401694´¦¿½±´¹ýÀ´µÄ¡£Òò´Ë__vbaAryConstruct2º¯ÊýµÄ×÷ÓÿÉÒÔÕâÑùÀí½â£ºÏÈ´Ó401694
´¦¿½±´24¸ö×Ö½Úµ½ebp-2c´¦£¬È»ºó·ÖÅäÒ»¿é¿Õ¼ä£¬°ÑÖ¸ÏòзÖÅäµÄ¿Õ¼äµÄÖ¸ÕëÌîµ½63F3F0
´¦¡£
ÄÇôÉÏÃæÕâЩÊý¾Ýµ½µ×ÊÇʲôÒâË¼ÄØ£¿¿´ÏÂÃæµÄ·ÖÎö.
00401A18 PUSH ¹¤³Ì1.00401A30 //Ö¸ÏòÍ˳öµØÖ·
00401A1D LEA EDX,DWORD PTR SS:[EBP-34]
00401A20 LEA ECX,DWORD PTR SS:[EBP-2C] //ÒªÊͷŵÄÊý×é±äÁ¿
00401A23 PUSH EDX
00401A24 PUSH 0
00401A26 MOV DWORD PTR SS:[EBP-34],ECX
00401A29 CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryDestruct>] // ÊÍ·ÅÒ»¸öÊý×é
ΪÁËŪÇå³þÉÏÃæÌáµ½µÄÄÇЩÄÚ´æÊý¾ÝµÄº¬Ò壬ÎÒ·Ö±ð¶¨ÒåÁ˲»Í¬´óС²»Í¬ÀàÐ͵ÄÊý×éÀ´±È½Ï£¬
ÏÂÃæÊÇdump³öÀ´µÄµäÐÍÊý¾Ý£º
Dim a(3 To 6)
0063F3E4 01 00 92 08 10 00 00 00 .?...
0063F3EC 00 00 00 00 2C 01 41 00 ....,A.
0063F3F4 04 00 00 00 03 00 00 00 ......
Dim a(3 To 6) As String
0063F3E4 01 00 92 01 04 00 00 00 .?...
0063F3EC 00 00 00 00 C0 0F 51 00 ....?Q.
0063F3F4 04 00 00 00 03 00 00 00 ......
Dim a(3 To 6) As Integer
0063F3E4 01 00 92 00 02 00 00 00 .?...
0063F3EC 00 00 00 00 C0 0F 51 00 ....?Q.
0063F3F4 04 00 00 00 03 00 00 00 ......
ÎÒ×ܽáµÄÊý×é±äÁ¿ÄÚ´æÊý¾ÝµÄ˵Ã÷£º
0063F3E4 ´¦µÄÁ½¸ö×Ö½Ú´ú±íÊý×éµÄάÊý
0063F3E6 ´¦µÄÒ»¸ö×Ö½Ú 92 ´ú±í¾²Ì¬Êý×é
0063F3E7 ´¦µÄÒ»¸ö×Ö½ÚËæ×Ų»Í¬ÀàÐ͵ıäÁ¿Óв»Í¬µÄ±ä»¯¡£
08 : ±äÌåÀàÐÍ
01 : String
00 : Integer,byte,long,single,double,date
0063F3E8 ´¦µÄÁ½¸ö×Ö½Ú±íʾһ¸öÊý×éÔªËØËùÕ¼µÄÄÚ´æ¿Õ¼ä×Ö½ÚÊý¡£
0063F3EC ´¦µÄ4¸ö×Ö½Ú×ÜÊÇ0£¬¿ÉÄÜÊÇΪÁË¶ÔÆë¡£
0063F3F0 ´¦µÄÁ½¸ö×Ö½Ú´ú±í·ÖÅäµÄ¿Õ¼äµÄµØÖ·Ö¸Õ룬¼´Êý×éÊý¾Ý¡£
0063F3F4 ´¦µÄÁ½¸ö×Ö½Ú´ú±í¾²Ì¬Êý×éÔªËØµÄ¸öÊý¡£
0063F3F8 ´¦µÄÁ½¸ö×Ö½Ú´ú±íÊý×éµÄÆðʼϱꡣ
ÉÏÃæ´ó¸ÅµÄ¶ÔÊý×é±äÁ¿µÄÊý¾Ý×öÁË˵Ã÷£¬ÎªÁËÑé֤һϣ¬ÔÙ¿´Ò»¸ö3άÊý×éµÄ¶¨Òå:
Dim a(1 To 2, 3 To 5, 6 To 9) As Integer
0063F3D4 03 00 92 00 02 00 00 00 .?...
0063F3DC 00 00 00 00 C0 0F 51 00 ....?Q.
0063F3E4 04 00 00 00 06 00 00 00 ......
0063F3EC 03 00 00 00 03 00 00 00 ......
0063F3F4 02 00 00 00 01 00 00 00 ......
¿ÉÒÔ¿´³ö£¬¾²Ì¬Êý×éµÄÐÅÏ¢ÔÚ±àÒëʱ¾Í±»±àÂëµ½ÁË´úÂë¶ÎÀï¡£
¾²Ì¬Êý×éµÄ¹¹ÔìÓà __vbaAryConstruct2
¾²Ì¬Êý×éµÄÊÍ·ÅÓà __vbaAryDestruct
///////////////////////////////////////////////////////////
¶¯Ì¬Êý×éÓÖÊÇÔõÑùʵÏÖµÄÄØ£¿
´úÂë:
Dim a() As Date
ReDim a(2 To 5)
·´»ã±à´úÂë:
004019CF PUSH 2 //Æðʼϱê
004019D1 PUSH 5 //½áÊøÏ±ê
004019D3 PUSH 1 //Êý×éάÊý
004019D5 LEA EAX,DWORD PTR SS:[EBP-18]
004019D8 PUSH 7 //±äÁ¿ÀàÐÍ
004019DA PUSH EAX //ÎÒÃÇÖØ¶¨ÒåµÄÊý×é±äÁ¿
004019DB XOR ESI,ESI
004019DD PUSH 8 //Êý×éÔªËØËùÕ¼ÄÚ´æ¿Õ¼äµÄ×Ö½ÚÊý
004019DF PUSH 80 //¶¯Ì¬Êý×é±ê¼Ç
004019E4 MOV DWORD PTR SS:[EBP-18],ESI
004019E7 CALL DWORD PTR DS:[<&MSVBVM60.__vbaRedim>] // ReDim
004019ED ADD ESP,1C
004019F0 MOV DWORD PTR SS:[EBP-4],ESI
004019F3 PUSH ¹¤³Ì1.00401A05
004019F8 LEA ECX,DWORD PTR SS:[EBP-18] //Êý×é±äÁ¿
004019FB PUSH ECX
004019FC PUSH 0
004019FE CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryDestruct>] //ÊÍ·ÅÊý×é
µ±Ö´Ðе½ 004019ED ʱ,ÎÒÃDz鿴[ebp-18]´¦µÄÄÚ´æÊý¾Ý,¿ÉÒÔ¿´µ½ÊÇ
0063F3F8 D0 0F 51 00 ?Q.ôø
ÕâÊÇÒ»¸öÖ¸Õë,ÎÒÃǽÓ×Å follow dword in dump,¿ÉÒÔ¿´µ½Êý¾ÝÈçÏÂ:
00510FD0 01 00 80 00 08 00 00 00 .€....
00510FD8 00 00 00 00 2C 01 41 00 ....,A.
00510FE0 04 00 00 00 02 00 00 00 ......
Õâ¸ö½á¹¹ºÍ¾²Ì¬Êý×éµÄ½á¹¹Ã»ÓÐʲô²»Í¬! ^_^
ͬʱҲ¿ÉÒÔ¿´³ö,¶¯Ì¬Êý×éÊǶ¯Ì¬·ÖÅäµÄ,ÕâºÍ¾²Ì¬Êý×éÐÅÏ¢±»±àÒëµ½´úÂë¶ÎÀﲻͬ¡£
×ܽá:
¶¯Ì¬Êý×éµÄReDim(ÖØ¶¨Òå)Óà __vbaRedim (×¢:ÕâÊǿɱä²ÎÊýµÄº¯Êý)
¶¯Ì¬Êý×éµÄÊÍ·ÅÓà __vbaAryDestruct
///////////////////////////////////////////////////////////
ÔÙ¿´Ò»Ï³£ÓõÄÊý×é²Ù×÷:
ÏÈ¿´Á½¸öº¯Êý,LboundºÍUbound¡£ËüÃǵÄʵÏÖ·Ö±ðÈçÏ£º
£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½
__vbaLbound ;º¯Êý Lbound ,È¡Êý×éϱêϽç
LEA EAX,DWORD PTR SS:[EBP-2C] ;²ÎÊý1,Êý×é
PUSH EAX
PUSH 1 ;²ÎÊý2,Êý×éάÊý
CALL DWORD PTR DS:[<&MSVBVM60.__vbaLboun>; MSVBVM60.__vbaLbound
;½á¹ûÔÚeaxÖзµ»Ø
£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½
__vbaUbound ;º¯Êý Ubound ,È¡Êý×éϱêÉϽç
LEA ECX,DWORD PTR SS:[EBP-2C] ;²ÎÊý1,Êý×é
PUSH ECX
PUSH 1 ;²ÎÊý2,Êý×éάÊý
CALL DWORD PTR DS:[<&MSVBVM60.__vbaUboun>;MSVBVM60.__vbaUbound
;½á¹ûÔÚeaxÖзµ»Ø
£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½
ÕâÁ½¸öº¯ÊýÔÙ²Ù×÷¶¯Ì¬Êý×éʱ³£Ê¹Óã¬ÕâÀïÏȼÇסËûÃǵÄʵÏÖ·½·¨¡£
»¹ÓÐÒ»¸ö³£Ê¹Óõĺ¯Êý£ºErase ,Õâ¸öº¯ÊýÓÃÀ´ÖØÐ³õʼ»¯¾²Ì¬Êý×éµÄÔªËØ£¬»òÕß
ÊͷŶ¯Ì¬Êý×éµÄ´æ´¢¿Õ¼ä¡£
LEA EAX,DWORD PTR SS:[EBP-18] ;Êý×é±äÁ¿µÄµØÖ·
PUSH EAX
PUSH EDI ;0
CALL DWORD PTR DS:[<&MSVBVM60.__vbaErase>] ;º¯ÊýErase
ÏÂÃæ±àдһ¶Î¼òµ¥µÄ´úÂë·ÖÎöÒ»ÏÂ:
Dim a() As Integer
ReDim a(2 To 5)
a(2) = &HAA
Erase a
Dim b(1 To 3) As Integer
b(1) = &H55
Erase b
·´»ã±à´úÂëÈçÏÂ:
00401A4F PUSH 2
00401A51 LEA EAX,DWORD PTR SS:[EBP-30]
00401A54 XOR EDI,EDI
00401A56 PUSH ¹¤³Ì1.004016B8
00401A5B PUSH EAX
00401A5C MOV DWORD PTR SS:[EBP-18],EDI
00401A5F MOV DWORD PTR SS:[EBP-38],EDI
00401A62 CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryConstruct2>]
/////////////////////////////////////ÉÏÃæÕâ¶ÎÊÇ Dim b(1 To 3) As Integer
00401A68 PUSH 2
00401A6A PUSH 5
00401A6C PUSH 1
00401A6E LEA ECX,DWORD PTR SS:[EBP-18]
00401A71 PUSH 2
00401A73 PUSH ECX
00401A74 PUSH 2
00401A76 PUSH 80
00401A7B CALL DWORD PTR DS:[<&MSVBVM60.__vbaRedim>]
//////////////////////////////////////ÉÏÃæÕâ¶ÎÊÇ Dim a() As Integer
////////////////////////////////////// ReDim a(2 To 5)
00401A81 MOV ECX,DWORD PTR SS:[EBP-18]
00401A84 ADD ESP,1C
00401A87 CMP ECX,EDI
00401A89 JE SHORT ¹¤³Ì1.00401AB0
00401A8B CMP WORD PTR DS:[ECX],1
00401A8F JNZ SHORT ¹¤³Ì1.00401AB0
00401A91 MOV EDX,DWORD PTR DS:[ECX+14] //È¡³öϱê
00401A94 MOV EAX,DWORD PTR DS:[ECX+10]
00401A97 MOV ESI,2
00401A9C SUB ESI,EDX
00401A9E CMP ESI,EAX
00401AA0 JB SHORT ¹¤³Ì1.00401AAB
00401AA2 CALL DWORD PTR DS:[<&MSVBVM60.__vbaGenerateBoundsError>]
00401AA8 MOV ECX,DWORD PTR SS:[EBP-18]
00401AAB LEA EAX,DWORD PTR DS:[ESI+ESI] //³ËÒÔ2,¼´ÕûÊýËùÕ¼´æ´¢¿Õ¼ä
00401AAE JMP SHORT ¹¤³Ì1.00401AB9
00401AB0 CALL DWORD PTR DS:[<&MSVBVM60.__vbaGenerateBoundsError>]
00401AB6 MOV ECX,DWORD PTR SS:[EBP-18]
////////////////////////////////////////ÉÏÃæÕâ¶Î°üº¬Á˶ÔÉú³ÉµÄ¶¯Ì¬Êý×éµÄ¼ìÑé
00401AB9 MOV EDX,DWORD PTR DS:[ECX+C] //È¡³ö±äÁ¿aµÄÖµµØÖ·
00401ABC MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaErase>]
00401AC2 MOV WORD PTR DS:[EDX+EAX],0AA //¶ÔµÚÒ»¸öÔªËØ¸³Öµ
////////////////////////////////////////µ½ÕâÀïÊÇ a(2) = &HAA
00401AC8 LEA EAX,DWORD PTR SS:[EBP-18]
00401ACB PUSH EAX
00401ACC PUSH EDI
00401ACD CALL ESI
////////////////////////////////////////µ½ÕâÀïÊÇ Erase a
00401ACF MOV ECX,DWORD PTR SS:[EBP-24]//È¡µÃ±äÁ¿bµÄÖµµØÖ·
00401AD2 LEA EAX,DWORD PTR SS:[EBP-38]
00401AD5 LEA EDX,DWORD PTR SS:[EBP-30]
00401AD8 PUSH EAX
00401AD9 MOV WORD PTR DS:[ECX],55
////////////////////////////////////////µ½ÕâÀïÊÇ b(1) = &H55
00401ADE PUSH EDI
00401ADF MOV DWORD PTR SS:[EBP-38],EDX
00401AE2 CALL ESI
////////////////////////////////////////µ½ÕâÀïÊÇ Erase b
00401AE4 MOV DWORD PTR SS:[EBP-4],EDI
00401AE7 PUSH ¹¤³Ì1.00401B09
00401AEC MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaAryDestruct>]
00401AF2 LEA ECX,DWORD PTR SS:[EBP-18]
00401AF5 XOR EDI,EDI
00401AF7 PUSH ECX
00401AF8 PUSH EDI
00401AF9 CALL ESI //ÊÍ·Åa
00401AFB LEA EAX,DWORD PTR SS:[EBP-38]
00401AFE LEA EDX,DWORD PTR SS:[EBP-30]
00401B01 PUSH EAX
00401B02 PUSH EDI
00401B03 MOV DWORD PTR SS:[EBP-38],EDX
00401B06 CALL ESI //ÊÍ·Åb
¹ØÓÚÊý×é¾ÍÏÈ·ÖÎöÕâЩ,ºóÃæ»¹Òª·ÖÎöµÄÊÇ For Each .. NextÓï¾äºÍ Arrayº¯Êý,
²»¹ýÕâÁ½¸ö¶¼±È½Ï¸´ÔÓЩ,Ïȷŵ½ºóÃæÈ¥¡£
3)½á¹¹ÀàÐ͵ÄʵÏÖ
VBµÄ¼Ç¼±äÁ¿Æäʵ¾ÍÊÇһЩ×ÓÓòµÄ˳ÐòÅÅÁС£
Õâ¾ä»°ÔõôÀí½âÄØ£¿¿´¿´ÏÂÃæµÄ´úÂ룺
Private Type daterec
year As Integer
month As String * 3
day As Integer
End Type
Dim a As daterec
a.year = 2004
a.month = "Jan"
a.day = 21
·´»ã±à´úÂëÈçÏ£º
004019DF XOR EAX,EAX
004019E1 LEA ECX,DWORD PTR SS:[EBP-1E]
004019E4 MOV DWORD PTR SS:[EBP-20],EAX
004019E7 PUSH ¹¤³Ì1.004014CC //"Jan"
004019EC MOV DWORD PTR SS:[EBP-1C],EAX
004019EF PUSH ECX
004019F0 PUSH 3
004019F2 MOV WORD PTR SS:[EBP-18],AX
004019F6 MOV WORD PTR SS:[EBP-20],7D4 // a.year = 2004
004019FC CALL DWORD PTR DS:[<&MSVBVM60.__vbaLsetFixstr>]//a.month = "Jan"
00401A02 MOV WORD PTR SS:[EBP-18],15 // a.day = 15
Ö´Ðе½ÕâÀïʱ¿´ÄÚ´æ[ebp-20]:
0063F3F0 D4 07 4A 00 61 00 6E 00 ?J.a.n.
0063F3F8 15 00 6F 17 F4 F8 63 00 .oôøc.
´Ó 0063F3F0 µ½ 0063F3F9 ¾ÍÊǼǼ±äÁ¿ a µÄÖµÁË¡£