ÄúÏÖÔÚµÄλÖãºÊ×Ò³ >> »ù´¡Ëã·¨ >> window»ù´¡ >> ÄÚÈÝ

ÉîÈëÆÊÎöDelphiÖÐIN²Ù×÷·ûʵÏÖÔ­Àí(±àÒë)

ʱ¼ä£º2011/9/3 15:28:08 µã»÷£º

¡¡¡¡ºËÐÄÌáʾ£ºÈºÓÑ̽ÌÖµ½Õâ¸öÎÊÌâ˳±ãÓпշÖÎöÁËÏÂdelphi±àÒëÆ÷µÄʵÏÖ·½Ê½£¬ÓдíÎóµØ·½¾´ÇëÖ¸³ö¡£function AnsiStrInCharSet(ch: char; CharSet: TSysCharSet):...
ȺÓÑ̽ÌÖµ½Õâ¸öÎÊÌâ˳±ãÓпշÖÎöÁËÏÂdelphi±àÒëÆ÷µÄʵÏÖ·½Ê½£¬ÓдíÎóµØ·½¾´ÇëÖ¸³ö¡£
function AnsiStrInCharSet(ch: char; CharSet: TSysCharSet): boolean;
begin
  Result := ch in CharSet;
end;
²âÊÔµ÷Óãºif AnsiStrInCharSet('a', ['a'..'z']) then ... 

ʵ¼Ê±àÒëÆ÷·­ÒëΪÒÔÏ´úÂ룺
0045BF7A |. F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] ;  
¸´ÖÆESI( ['a'..'z']) µ½BTÖ¸Áî±êÖ¾ÅжÏdest²Ù×÷Êý£¬Ò²¾ÍÊÇCharSet: TSysCharSet µÄÄÚÈÝÓɱàÒëÆ÷¹Ì¶¨±àÒëΪһ¸öλÐÅÏ¢³£Á¿£¬¸Ã³£Á¿³¤¶ÈΪ32byte£¬¶¨Òå½á¹¹Îª£º

TBitInfoField =array [0..7] of dword;

ÔݳƸó£Á¿ÎªBitInfoField:TBitInfoField ¾ßÌå¹æÔòºóÃæ½²Êö¡£

0045BF7C |. 0FB6C0 movzx eax, al ;  
¸³Öµµ½BTÖ¸Áî±êÖ¾ÅжÏsrc²Ù×÷Êý,Ò²¾ÍÊÇch: char

0045BF7F |. 0FA345 E0 bt dword ptr [ebp-20], eax ; 
[ebp-20] ʵ¼ÊÖ¸ÏòBitInfoField£¬eaxÊÇλÊý£¬×÷ÓþÍÊÇ°ÑBitInfoFieldµÄµÚeaxλËÍCF±êÖ¾

±ÈÈç['a'..'z']±àÒëÆ÷±àÒëµÄBitInfoFieldΪ:
0012F588 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF 07 ............?ÿ 
0012F598 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

[#0..#255]±àÒëÆ÷±àÒëµÄBitInfoFieldΪ:
0012F588 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
0012F598 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Ϊʲô±àÒëÆ÷»áÕâô±àÒëÄØ£¿ÒòΪbtÖ¸ÁîÊÇÒ»¸ö±êÖ¾²âÊÔÖ¸Áî¾ßÌåÓï·¨¸ñʽΪ£º
 BT r/m16,r16
 ½«ËùÑ¡µÄλ´æ´¢µ½ CF ±êÖ¾ 
 BT r/m32,r32
 ½«ËùÑ¡µÄλ´æ´¢µ½ CF ±êÖ¾  
 BT r/m16,imm8
 ½«ËùÑ¡µÄλ´æ´¢µ½ CF ±êÖ¾  
 BT r/m32,imm8
 ½«ËùÑ¡µÄλ´æ´¢µ½ CF ±êÖ¾
 ÕâÀïÓÐÁ½¸ö¹«Ê½È·¶¨Î»Öµ£º
 1. BIdx= BitOffset div 32 
 2. BBit= BitOffset mod 32
ÎÒÃÇÕâÀïµÄin±àÒëÆ÷ʹÓõÄÊÇ BT m32,r32¸ñʽ£¬ËüµÄ×÷ÓþÍÊÇ°Ñm32ÄÚ´æÖÐBitInfoField[BIdx(r32)]³£Á¿µÄÊý¾ÝµÄµÚBitInfoField[BBit(r32)]λËÍCF±êÖ¾.
¼ÙÉèö¾Ù·¶Î§ÊÇ['a'..'z'] ÔòBitInfoFieldΪ:

 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF 07  
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    

'a' in ['a'..'z'] ×îºóת»»³ÉµÄCPUÖ¸ÁîÓ¦¸ÃÊÇ£º

bt dword ptr [BitInfoField] , eax ; eax= $61

ÒòΪ 'a'µÄAscllÂëΪ£º$61 ¸ù¾Ý¹«Ê½£º BIdx = $61 div 32 = 3 , BBit= BitOffset mod 32 =1 
BitInfoField[BIdx=3 ] = $7FFFFFE ת»»Îª¶þ½øÖÆΪ£º00000111111111111111111111111110
BBit = 1
00000111111111111111111111111110
31-------------------------------0

ÄÇô bt dword ptr [BitInfoField] , $61 ¾ÍÊÇ°ÑÏÂÃæ±êÖ¾´«Ë͵½CF±êÖ¾¼Ä´æÆ÷
000001111111111111111111111111[1]0
31-------------------------------0

ËùÒÔCF =1
ÕâÑù¾ÍÍê³ÉÁË'a' in ['a'..'z'] µÄÅжϡ£
¸ù¾Ý´ËÔ­Àí¿ÉÒÔÍƵ¼³ö delphiµÄ char in ['a'..'z'] ºÍ char in ['a'..'z','1'..'9'] Ö´ÐÐЧÂÊÊÇÒ»ÑùµÄ
ÒòΪ['a'..'z','1'..'9'] µÄBitInfoFieldΪ£º

00 00 00 00 00 00 FE 03 00 00 00 00 FE FF FF 07 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

µ±ÅжÏÈÎÒâ×Ö·û bt dword ptr [BitInfoField] , BitOffset 
ͨ¹ý¹«Ê½£º

 1. BIdx= BitOffset div 32  
 2. BBit= BitOffset mod 32

¼ÆËã³öBIdx ºÍBBit Ö»Ðè°ÑÏàÓ¦±ê־λ´«Ë͵½CF¼´Íê³É¡£
×ܽáDELPHI in ²Ù×÷ЧÂʱÈpos²Ù×÷ЧÂÊÒª¸ßºÜ¶à£¬²¢ÇÒЧÂʲ»±»Ã¶¾ÙÔªËظöÊýºÍ¶àÉÙÓ°Ï죬ȱµãÊÇÖ»ÄÜÅжÏ0-255·¶Î§µÄÊý¾Ý¡£

×÷Õߣºcodegame¡¡À´Ô´£º×ªÔØ
¹²ÓÐÆÀÂÛ 0 ÌõÏà¹ØÆÀÂÛ
·¢±íÎÒµÄÆÀÂÛ
  • ´óÃû£º
  • ÄÚÈÝ£º
  • ºÐ×ÓÎÄÕÂ(www.2ccc.com) © 2024 °æȨËùÓÐ All Rights Reserved.
  • »¦ICP±¸05001939ºÅ