рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдпрд╛ рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдмреНрд░реЗрдирдлреИрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛

рдмреНрд░реЗрдирдлреИрдХ рднрд╛рд╖рд╛ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ рдЯреЗрдк рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХрдо рдпрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдЪрдХреНрд░реЛрдВ рдореЗрдВ, рд╣рдо рдПрдХ рдЫреЛрд░ рд╕реЗ рджреВрд╕рд░реЗ рдЫреЛрд░ рддрдХ рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдЧрд┐рди рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдХреНрд╕рд░ рдХрдИ рдиреЗрд╕реНрдЯреЗрдб рдЪрдХреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдзреАрдореА рд╣реИред рдмреЗрд╢рдХ, рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди ... рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ: рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рди рдЪрд▓рд╛рдПрдВ:



>+>+>+>+>++<[>[<+++>- >>>>> >+>+>+>+>++<[>[<+++>- >>>>> >+>+>+>+>++<[>[<+++>- >>>>> >+>+>+>+>++<[>[<+++>- >>>>> +++[->+++++<]>[-]< <<<<< ]<<]>[-] <<<<< ]<<]>[-] <<<<< ]<<]>[-] <<<<< ]<<]>.
      
      







рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ? рд╕рд╣рдордд рд╣реВрдБ рдХрд┐ рдпрд╣ рдЙрддрдирд╛ рддреЗрдЬрд╝ рдирд╣реАрдВ рдерд╛ рдЬрд┐рддрдирд╛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред



рдпрд╣ JIT рд╕рдВрдХрд▓рди рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╕реАрдзреЗ рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдорд╢реАрди рдХреЛрдб рдХреЗ рдкреВрд░реЗ рдЖрд╡рд╢реНрдпрдХ рд╕рд░рдгреА рдХреЛ рддреБрд░рдВрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдореАрдЪреАрди рд╣реЛрдЧрд╛, рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛ рд╕рд╛рд░ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕реЗ рдХреНрд░рдо рдореЗрдВ рд▓реЗрдВред



рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдмреНрд░реЗрдирдлреИрдХ рднрд╛рд╖рд╛ рдХреЗ рд╡рд╛рдХреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХреЗрд╡рд▓ 8 рдСрдкрд░реЗрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдореЗрдВ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдФрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдмреНрд░реЗрдирдлреЙрдХ рдХреЛрдб рдХреЛ x86 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ (рдЙрдирдХреЗ рдорд╢реАрди рдХреЛрдб) рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдорд╢реАрди рдХреЛрдб (рдУрдкрдХреЛрдб) рдмрдирд╛рдиреЗ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рдо рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ x86 рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдмреНрд░реЗрдирдлрдХ рдХрдорд╛рдВрдб рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рдкрд╛рд╕реНрдХрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ (рдФрд░ рдЖрдЧреЗ рдХреЗ рдХреЛрдб рдЗрд╕ рдкрд░ рд╣реЛрдВрдЧреЗ), рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 Var Stack : Pointer; Begin GetMem(Stack,30000); //    brainfuck - 30000 End;
      
      





рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдмреНрд░реЗрдирдлрдХ рдХреА рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдгрдиреАрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛:

рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдИрдПрд╕рдЖрдИ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 mov esi, Stack
      
      







рдлрд┐рд░, рдмрд╛рдХреА рдЯреАрдореЗрдВ рд╣реЛрдВрдЧреА:

Brainfuck рдХреЛрдбрд╛рдВрддрд░рдХ opcode
+ inc рдмрд╛рдЗрдЯ [esi] рдПрдлрдИ 06
- рдбрд┐рдХ рдмрд╛рдЗрдЯ [esi] рдПрдлрдИ 0 рдИ
> inc esi 46
< deci 4E
[ cmp рдмрд╛рдЗрдЯ [esi], 0 80 3 рдИ 00
рдЬреЗрдИ "] +1" 0F 84 xx xx xx xx рдпрд╛ 74 xx
] jmp "[" E9 xx xx xx xx рдпрд╛ EB xx




рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдПред ' рдФрд░ ',', рддреЛ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рддреАрдХ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдПрдХ рдЬрд▓ рдкреНрд░рддреАрдХ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



 procedure WriteChar(S: Char); begin Write(S); end; function ReadChar: Char; var c : char; begin Read(c ); ReadChar := c; end;
      
      





рдлрд┐рд░, рд╣рдо рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ EDX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╡рд░реНрдг рдореБрджреНрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ

 mov edx, offset WriteChar
      
      





рдФрд░ EBX рд░рдЬрд┐рд╕реНрдЯрд░ рдЪрд░рд┐рддреНрд░ рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд╣реИ:

 mov ebx, offset ReadChar
      
      





рдлрд┐рд░, 'рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВред' рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрднрд╡ рд╣реИ:

 mov al,[esi] 8A 06 ;  AL    cbw 66 98 ;    EAX push eax 50 ;     () call edx FF D2 ;  WriteChar
      
      





рдФрд░ рдХрдорд╛рдВрдб "," рдЗрд╕ рддрд░рд╣:

 call ebx FF D3;  ReadChar mov [esi],al 88 06;      
      
      





рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ ExBuf рд╕рд░рдгреА рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдСрдкрдХреЛрдб рдбрд╛рд▓реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╕рд░рдгреА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред Ptr рд╡реИрд░рд┐рдПрдмрд▓ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЕрдВрддрд┐рдо рдУрдкрдХреЛрдб рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрдЧрд╛ред

 Var ExBuf : Array [1..65535] of Byte; Ptr : Word; Tmp : LongInt;
      
      





рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╣рд▓реЗ рддреАрди рдХрдорд╛рдВрдб рд╣реЛрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рд╕рд╣рдорддрд┐ рд╡реНрдпрдХреНрдд рдХреА, рдИрдПрд╕рдЖрдИ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╕реЗрд▓ рдкреЙрдЗрдВрдЯрд░ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛, рдИрдбреАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд░реАрдбрдЪрд╛рд░реНрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреЙрдЗрдВрдЯрд░ рдФрд░ рдИрдмреАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд░реАрдбрдЪреЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  ptr := 1; ExBuf[ptr] := $BE; inc(ptr); // mov esi,Stack asm mov edx,Stack mov Tmp,edx end; Move(Tmp,ExBuf[ptr],4); inc(ptr,4); ExBuf[ptr] := $BA; inc(ptr); // mov edx,offset WriteChar asm mov edx, offset WriteChar mov Tmp, edx end; Move(Tmp,ExBuf[ptr],4); inc(ptr,4); ExBuf[ptr] := $BB; inc(ptr); // mov ebx,offset ReadChar asm mov edx, offset ReadChar mov Tmp, edx end; Move(Tmp,ExBuf[ptr],4); inc(ptr,4);
      
      







рд╕рдм рдХреБрдЫ, рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдПрдХ Brainfuck рдХреЛрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд░реВрдЯреАрди рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдкрд╣рд▓реА рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 Procedure JITCode(S: Char); Begin Case S of '+': Begin ExBuf[ptr] := $FE; //inc byte ptr [esi] ExBuf[ptr+1] := $06; Inc(ptr,2); End; '-': Begin ExBuf[ptr] := $FE; //dec byte ptr [esi] ExBuf[ptr+1] := $0E; Inc(ptr,2); End; '>': Begin ExBuf[ptr] := $46; //inc esi Inc(ptr); End; '<': Begin ExBuf[ptr] := $4E; //dec esi Inc(ptr); End; '.': Begin ExBuf[ptr] := $8A; //mov al,[esi] ExBuf[ptr+1] := $06; Inc(ptr,2); ExBuf[ptr] := $66; //cbw ExBuf[ptr+1] := $98; Inc(ptr,2); ExBuf[ptr] := $50; //push eax Inc(ptr); ExBuf[ptr] := $FF; //call edx ExBuf[ptr+1] := $D2; Inc(ptr,2); End; ',': Begin ExBuf[ptr] := $FF; //call ReadChar ExBuf[ptr+1] := $D3; Inc(ptr,2); ExBuf[ptr] := $88; //mov [esi],al ExBuf[ptr+1] := $06; Inc(ptr,2); End; End;
      
      





рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рдмреНрд░реЗрдирдлрдХ рдХреЛрдб рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдПрдХреНрд╕рдХреНрдпреВрдл рд╕рд░рдгреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЬрд╛рддреЗ рд╣реИрдВред

рд▓реВрдк рдХрдорд╛рдВрдб '[' рдФрд░ '] рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╕рднреА рдХреЛ рдпрд╛рдж рд╣реИ, x86 рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдХрдИ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдореЛрдб рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдХрдИ рдкрд╛рд╕ рдпрд╛ рд╢реЙрд░реНрдЯ рдЬрдВрдк рдХрдорд╛рдВрдб рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЬрдВрдк рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдФрд░ рд▓реЗрдмрд▓ рдХреЗ рдмреАрдЪ рдХреЗ рдСрдкрдХреЛрдб рдХреА рдХреБрд▓ рд▓рдВрдмрд╛рдИ 127 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд╢реЙрд░реНрдЯ рдЬрдВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдирд┐рдХрдЯ рд╕рдВрдХреНрд░рдордг (рдирд┐рдХрдЯ) рдХреА рдЯреАрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧреАред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛: рдЬрдм '[' рдХрдорд╛рдВрдб рдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ xxx рдХрдорд╛рдВрдб рдХреЗ рдкрд╛рд╕ рдЬреЗрдИ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХрдорд╛рдВрдб рдмрдлрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрд░реЗ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реВрдВред рдмрд╛рдж рдореЗрдВ, рдЬрдм рдХрдорд╛рдВрдб ']' рдХреЛрдб рдореЗрдВ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд (рдмрд╛рдЗрдЯ рд▓рдВрдмрд╛рдИ) рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЕрдЧрд░ рдпрд╣ 127 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕реНрдерд┐рддрд┐ рдкрд░ рд▓реМрдЯрддрд╛ рд╣реВрдВ, xxx рдХреЗ рдкрд╛рд╕ рдкреБрд░рд╛рдиреА рдЬреАрдк рдХреЛ рдЬреЗрдИ рд╢реЙрд░реНрдЯ xxx рдХреЗ рд╕рд╛рде рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдмрд╛рдХреА рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдЖрдЧреЗред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд JITCode рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:

  '[': Begin ExBuf[ptr] := $80; //cmp byte ptr [esi],0 ExBuf[ptr+1] := $3E; ExBuf[ptr+2] := $00; Inc(ptr,3); ExBuf[ptr] := $0F; //je near xxx ExBuf[ptr+1] := $84; Inc(ptr,2); bstack[bcnt] := ptr; inc(bcnt); Inc(ptr,4); End; ']': Begin Tmp := ptr - bstack[bcnt-1]; If Tmp > 122 then begin ExBuf[ptr] := $E9; //jmp Inc(ptr); Inc(Tmp); Move(Tmp,ExBuf[bstack[bcnt-1]],4); Tmp := -Tmp-9; Move(Tmp,ExBuf[ptr],4); Inc(ptr,4); Dec(bcnt); end else begin ExBuf[ptr] := $EB; //jmp short Inc(ptr); ExBuf[bstack[bcnt-1]-2] := $74; // je short xxx Dec(Tmp,2); Move(Tmp,ExBuf[bstack[bcnt-1]-1],1); Tmp := -Tmp-5; Move(Tmp,ExBuf[ptr],1); Inc(ptr); Move(ExBuf[bstack[bcnt-1]+4],ExBuf[bstack[bcnt-1]],ptr-bstack[bcnt-1]-4); Dec(ptr,4); Dec(bcnt); end; End;
      
      





рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рд╣реИ, рдпрд╣ рдПрдХ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдмрд╣реБрдд рдХреБрдЫ рдмрдЪрд╛ рдирд╣реАрдВ рд╣реИ - рдЕрдВрддрд┐рдо рд░рд┐рдЯ рдХрдорд╛рдВрдб (рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╡рд╛рдкрд╕реА) рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдЙрд╕рдХрд╛ рдУрдкрдХреЛрдб 0xC3 рд╣реИ:

  ExBuf[ptr] := $C3; //retn
      
      





рдФрд░ рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдмрдлрд░ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ:

  asm mov edx,offset ExBuf call edx end;
      
      







рд▓реЗрдХрд┐рди рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╕рддрд╣ рдкрд░ рд╣реИ: рдмреНрд░реЗрдирдлрдХ рдХреЛрдб рдореЗрдВ, рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛрд╣рд░рд╛рдпрд╛ рдХрдорд╛рдВрдб рдЕрдХреНрд╕рд░ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ++++++++++++++ рдпрд╛ <<<<ред рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреЛ 11 рд╕реЗ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рд╕реЗрд▓ рдкреЙрдЗрдВрдЯрд░ 4 рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдг рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХреЗрдд рдХрд░реЗрдВрдЧреЗ:



<<<<< = рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд p # (prev) рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрд╛рдИрдВ рдУрд░ # рдорд╛рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рддреБрд░рдВрдд рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ

>>>>> = рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд n # (рдЕрдЧрд▓рд╛) # рдорд╛рдиреЛрдВ рд╕реЗ рд╕реВрдЪрдХ рдХреЛ рддреБрд░рдВрдд рдШреБрдорд╛рддреЗ рд╣реБрдП

+++++ = рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд i # (inc) рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреЛ рддреБрд░рдВрдд рдмрдврд╝рд╛рдХрд░ #

- # d (dec) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреЛ рддреБрд░рдВрдд # рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

[-], [+] = z (рд╢реВрдиреНрдп) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рд╕реЗрд▓ рдорд╛рди рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛



рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХрднреА-рдХрднреА, рдпрд╣ рдмреНрд░реЗрдирдлрдХ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рджреЗрддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, x86 рдХреЛрдб рдореЗрдВ рдХрдореАред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╣рдорд╛рд░реА JITCode рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

  'i': Begin ExBuf[ptr] := $80; //add byte ptr [esi],xx ExBuf[ptr+1] := $06; ExBuf[ptr+2] := Ord(Buf[i+1]); Inc(i); Inc(ptr,3); End; 'd': Begin ExBuf[ptr] := $80; //sub byte ptr [esi],xx ExBuf[ptr+1] := $2E; ExBuf[ptr+2] := Ord(Buf[i+1]); Inc(i); Inc(ptr,3); End; 'n': Begin ExBuf[ptr] := $83; //add esi,xx ExBuf[ptr+1] := $C6; ExBuf[ptr+2] := Ord(Buf[i+1]); Inc(i); Inc(ptr,3); End; 'p': Begin ExBuf[ptr] := $83; //sub esi,xx ExBuf[ptr+1] := $EE; ExBuf[ptr+2] := Ord(Buf[i+1]); Inc(i); Inc(ptr,3); End; 'z': Begin ExBuf[ptr] := $C6; //mov byte ptr [esi],0 ExBuf[ptr+1] := $06; ExBuf[ptr+2] := $00; Inc(ptr,3); End;
      
      







рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд╕рдВрдХрд▓рд┐рдд Win32 рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: rghost.ru/4249797



рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рд╣реИрдВ:

-c - рдбрд┐рд╕реНрдХ рдкрд░ рдПрдХ OUT.BC рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдмрд╛рдж рдПрдХ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдмрд╛рдИрдЯреЗрдХреЛрдб рд╣реЛред

-b - рдорд╢реАрди рдХреЛрдб рдХреЗ рдЙрддреНрдкрдиреНрди рд╕рд░рдгреА рд╡рд╛рд▓реЗ рдбрд┐рд╕реНрдХ рдкрд░ BF.BIN рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ HIEW рдореЗрдВ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдбрд╛рдВрддрд░рдХ рдХрдорд╛рдВрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред



рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБред



All Articles