¡¡¡¡ºËÐÄÌáʾ£ºÈºÓÑ̽ÌÖµ½Õâ¸öÎÊÌâ˳±ãÓпշÖÎöÁËÏÂ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·¶Î§µÄÊý¾Ý¡£