рд╕рдВрдХрд▓рдиред 9: рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб

рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЦрд┐рд▓реМрдирд╛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЗ-рдХреНрд░реЗрдХред рд╣рдордиреЗ рдкреА-рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реБрдЖрдд рдХреА, рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛ - рдЖрдЙрдЯрдкреБрдЯ рдорд╢реАрди-рдирд┐рд░реНрднрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рд▓рд┐рдПред

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



рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдЧреЗ:

  1. рдХреЛрдб рдЪрдпрди
  2. рд▓реЛрдбрд░
  3. рдкреА рдХреЛрдб рдмрджрд▓рддрд╛ рд╣реИ
  4. рдкреАрдврд╝реА
  5. рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?

рдХреЛрдб рдЪрдпрди



рдореИрдВ рдпрд╣ рдорд╛рдирдХрд░ рдЪрд▓рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдПрдХ рдРрд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ x86 рдпрд╛ x64 рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рдореИрдВ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ: рдлреИрд╢рдиреЗрдмрд▓ рдЧреИрдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред



рд╣рдо рдПрдХ "рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо" рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдЬреЛ x86 рдФрд░ x64 рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИред рд╣рдо рдорд╢реАрди рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдмреВрдЯрд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рдИрдПрд▓рдПрдл рдкреНрд░рд╛рд░реВрдк рдФрд░ рдмрд╛рддрдЪреАрдд рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкрд░ рдирд╣реАрдВ; рдЗрд╕рд▓рд┐рдП, рд╣рдо рдбреЙрд╕ рдкреНрд░рд╛рд░реВрдк COM рдХреЗ рд╕рдорд╛рди рдПрдХ "рдареЛрд╕ рдЯреБрдХрдбрд╝рд╛" рдореЗрдВ рдХреЛрдб рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рд░рди рд╣рдорд╛рд░рд╛ рдЦреБрдж рдХрд╛ рдмреВрдЯрд▓реЛрдбрд░ рд╣реЛрдЧрд╛ред



рд╣рдо рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо, рднрд▓реЗ рд╣реА рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ, x64 рдФрд░ x86 рдкрд░ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред



рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ ( ECHO



рдФрд░ INPUT



рдХрдорд╛рдВрдб) рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╣ рдЙрдирдХреЗ рдкрддреЗ рдХреЛ рдХреИрд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ?

рд▓реЛрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо "рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░" рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рд▓реЛрдбрд░ рдмрдирд╛рдПрдЧрд╛ - рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА "рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рдВрд╕" рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕ рд╕рд░рдгреА рдХрд╛ рдкрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдорд╛рдирдХ рдХрд╛рд░реНрдп рд╣реИрдВ: рдПрдХ рдирдВрдмрд░ рдХрд╛ рдЗрдирдкреБрдЯ, рдПрдХ рдирдВрдмрд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ, рдПрдХ рд▓рд╛рдЗрди рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ; рдЗрд╕рд▓рд┐рдП, рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рддреАрди рдмрд┐рдВрджреБ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рдкрддреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рддреБрд░рдВрдд EBP



/ EBP



рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдкрддреЗ рдХреЛ рдмрдЪрд╛рдПрдВред



рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ (рдЪрд░ рдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рд╡рд┐рд╢рд┐рд╖реНрдЯ x86 рдирд┐рд░рдкреЗрдХреНрд╖ рд╕рдВрдмреЛрдзрди рдХреЗ рдмрдЬрд╛рдп, x64 рдиреЗ RIP



рд╕рд╛рдкреЗрдХреНрд╖ "рд░реЛрдорд┐рдВрдЧ рдирд┐рд░рдкреЗрдХреНрд╖" рдкреЗрд╢ рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд╕рд╛рдкреЗрдХреНрд╖ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдПрдХ рд╣реА EBP



/ RBP



- рдпрд╛рдиреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ EBP



рд╣реБрдП рдЪрд░реЛрдВ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдСрдлрд╕реЗрдЯ 0x18



, рдЪрд░ рдХреНрд╖реЗрддреНрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред



рдЙрддреНрдкрдиреНрди рдкреА-рдХреЛрдб рдЪрд╛рд░ "рдЕрдореВрд░реНрдд рднреМрддрд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ" R01..R04



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ EAX,ECX,EDX,EBX



: рдпрд╛рдиреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ "рд╕рд╛рд░" рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдШрдЯрд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рдо рдмрд╛рдХреА рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред



рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ x86 рдФрд░ x64 рдкрд░ рдлрдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред X86 рдкрд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдЯреИрдХ ( cdecl ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк ECX,EDX,EAX



( рдлрд╛рд╕реНрдЯрдХреЙрд▓ ) рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ gcc



рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред X64 рдкрд░, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ RDI,RSI,RDX,RCX,R8,R9



рдЫрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ gcc



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

рджреЛрдиреЛрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░, рдмреБрд▓рд╛рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ EAX,ECX,EDX



рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЦрд░рд╛рдм рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ (рдпрджрд┐ рд╡реЗ рдЬреАрд╡рд┐рдд рд╣реИрдВ) рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдмрд╛рдж рдореЗрдВ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рднреМрддрд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдЬреАрд╡рди рд╢рдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдЙрдирдХреА рдирд┐рдпреБрдХреНрддрд┐ рдХреЗ рджреМрд░рд╛рди рдХрд┐рдпрд╛ рдерд╛, рдХреЛ рдХреЛрдб рдмрдирд╛рддреЗ рд╕рдордп рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



рдХреНрдпрд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛; рдпрд╣ рдЫреЛрдЯреА рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрджреНрджреЗрд╢реНрдп рдерд╛ред



рд▓реЛрдбрд░



рд╣рдо рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреА-рдХреЛрдб рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рд╕рднреА рдкрддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ (рдЗрдирдкреБрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдореИрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ), рдФрд░ рдкреЗрдЯ (рдХрдорд╛рдВрдбреНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдХреНрд░) рдХреЛ рд░реАрдб рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд sys-function рдереЗред

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/mman.h>

#include <sys/stat.h>



const char * fdata = NULL ; //



int input() { int d; scanf( " %d " , &d); return d; }

void echoi( int i) { printf( " %d " , i); }

void echos( int offset) { printf( " %s " , fdata+offset); }



void * linkarea[ 1000 ] = {( void *)input, ( void *)echoi, ( void *) echos};



int main( int argc, char ** argv) {



if (argc!= 2 ) {

printf( "Missing code file name. \n " );

exit( 1 );

}



int fd = open(argv[ 1 ], O_RDONLY);

if (fd< 0 ) {

printf( "Cannot open code file. \n " );

exit( 1 );

}

struct stat finfo;

fstat(fd, &finfo);

fdata = ( const char *)mmap( 0 , finfo.st_size, PROT_READ|PROT_EXEC, MAP_PRIVATE, fd, 0 );

if (!fdata) {

printf( "Cannot read code file. \n " );

exit( 1 );

}



(( void (*)( void **)) fdata)(linkarea); //



munmap(( void *)fdata, finfo.st_size);

close(fd);

return 0 ;

}







рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ #include "jsk.h"



рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рдХрдорд╛рдВрдб рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛: рдирдП рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рди рддреЛ j- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкрддрд╛ рд╣реИ, рдФрд░ рди рд╣реА рд╣рдорд╛рд░реЗ рдкреА-рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред



рдкреА рдХреЛрдб рдмрджрд▓рддрд╛ рд╣реИ



рдЕрдм рдЪреВрдВрдХрд┐ рдкреА-рдХреЛрдб рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрди рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдЕрджреГрд╢реНрдп рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЛ 4 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ; рдЗрд╕рд▓рд┐рдП, рди рддреЛ рдЪрд╛рд▓рд╛рдХ union



рдФрд░ рди рд╣реА рдХреНрд╖реЗрддреНрд░ рдЖрдХрд╛рд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред int



рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде jsk.h



рдмрджрд▓реЗрдВ:

struct command {

enum opcodes {

hlt, store, jz, echo, mov, load, input, add, sub, mul, div,

eq, ne, ge, le, gt, lt

};

opcodes opcode;

regnum dest, src1, src2;

int imm;

command(opcodes opcode, regnum dest, regnum src1, regnum src2) :

opcode(opcode), dest(dest), src1(src1), src2(src2) {}

command(opcodes opcode, regnum dest, int imm) :

opcode(opcode), dest(dest), imm(imm) {}

};









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



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, n-рдХрдорд╛рдВрдб add



рдХреЛ MOD тАЛтАЛрдореЗрдВ, INC



, DEC



, ADD



рдХреЗ рддреАрди рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдпрд╛ LEA



рдХреЗ рддреАрди рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдХреБрдЫ рд╕реНрдерд╛рдиреАрдп рдЕрдиреБрдХреВрд▓рди, рдЬреИрд╕реЗ рдХрд┐ mul r, r, 2



рдХреЛ add r, r, r



рдмрджрд▓рдирд╛ mul r, r, 2



рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрд╕рд╛рдиреА рд╕реЗ рдкреА-рдХреЛрдб рд╕реНрддрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╣реА рдЪрд░рдг рдореЗрдВ - рднреМрддрд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рдж, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдкрд╣рд▓реЗ - рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдиреБрд╡рд╛рдж рдХреЗ рджреМрд░рд╛рди рд╣рдо рдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

// :

// ...

if (i->cmd.opcode==command::mul) { //

if (i->known.count(i->cmd.src1)) std::swap(i->cmd.src1, i->cmd.src2);

if (i->known.count(i->cmd.src2)) switch (i->known[i->cmd.src2]) {

case - 1 : i->cmd = command(command::sub, i->cmd.dest, 0 , i->cmd.src1); break ;

case 0 : i->cmd = command(command::mov, i->cmd.dest, 0 ); break ;

case 1 : nopOut(i); break ;

case 2 : i->cmd = command(command::add, i->cmd.dest, i->cmd.src1, i->cmd.src1); break ;

}

}



// , ,

void postalloc() {

std::vector< bool > needed(lastreg+ 1 );

foreach(i, pcode) {

if (i->has2src()) {

if (!i->known.count(i->cmd.src1)) needed[i->cmd.src1]= true ;

if (!i->known.count(i->cmd.src2)) needed[i->cmd.src2]= true ;

else // src2 :

if (i->cmd.opcode==command::div && i->known[i->cmd.src2]!= 2 )

needed[i->cmd.src2]= true ; //

}

if (i->readsdest() && !i->known.count(i->cmd.dest))

needed[i->cmd.dest]= true ;

}

foreach(i, pcode)

if (i->writesdest() && !needed[i->cmd.dest])

nopOut(i);

}



// :

// ...

postalloc();

// NOP-

simpleopt();

// : , known

foreach(i, pcode) {

std::map<regnum, int > known;

if (i->known.count(i->cmd.dest))

known[physmap[i->cmd.dest]] = i->known[i->cmd.dest];

i->cmd.dest = physmap[i->cmd.dest];

if (i->has2src()) {

if (i->known.count(i->cmd.src1))

known[physmap[i->cmd.src1]] = i->known[i->cmd.src1];

if (i->known.count(i->cmd.src2))

known[physmap[i->cmd.src2]] = i->known[i->cmd.src2];

i->cmd.src1 = physmap[i->cmd.src1];

i->cmd.src2 = physmap[i->cmd.src2];

}

i->known = known;

}

break ;









рдкреАрдврд╝реА



рд╕рднреА рдЙрддреНрдкрдиреНрди рдХреЛрдб рдПрдХ рдмрдбрд╝реЗ рд╡реЗрдХреНрдЯрд░ std::vector<char> code;



рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ std::vector<char> code;





struct commandn



рд╣рдореЗрдВ рдХреБрдЫ рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред int offset, length;



code



рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдХрдорд╛рдВрдб рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, JZ



рдФрд░ ECHO



рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП, рдСрдлрд╝рд╕реЗрдЯ рд╡реИрд▓реНрдпреВ рдЬреЛ int needfixat;



рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рдЕрдВрдд рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ int needfixat;



рд╣рдо рдЕрдзреВрд░реЗ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░реЗрдВрдЧреЗред



рддреЛ, рдкреА-рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдкрд░, рд╣рдо рдХреЛрдб рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕рднреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ; рдлрд┐рд░ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реА рдмрд╛рд░ рдЬрд╛рдПрдВ рдФрд░ рд▓рд╛рдкрддрд╛ рдСрдлрд╕реЗрдЯ рдХреЛ рднрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рднреА рдХреЛрдб рдФрд░ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред



рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реВрдЪреА рд╕реЗ рд╕рдмрд╕реЗ рдирд┐рд░реНрдмрд╛рдз рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдкреВрд░рд╛ рд╕рдВрдХрд▓рдХ рдХреЛрдб tyomitch.net.ru/jsk.y.natv.html рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ



// : x86/x64

const char regsize = sizeof ( void *); // 4 8

//

if (regsize== 4 ) { // PUSH EBP / MOV EBP, [ESP+8] / PUSH EDI / PUSH ESI / PUSH EBX

code.push_back( 0x55 ); code.push_back( 0x8b ); code.push_back( 0x6c ); code.push_back( 0x24 );

code.push_back( 0x08 ); code.push_back( 0x57 ); code.push_back( 0x56 ); code.push_back( 0x53 );

} else { // PUSH EBP / MOV RBP, RDI / PUSH EBX

code.push_back( 0x55 ); code.push_back( 0x48 ); code.push_back( 0x8b ); code.push_back( 0xef );

code.push_back( 0x53 );

}

foreach(i, pcode) {

int imm, doffset, joffset;

bool jshort, saveAX, saveDX;

i->offset = code.size();

switch (i->cmd.opcode) {

case command::hlt:

if (regsize== 4 ) {

i->emit( 0x5b , 0x5e , 0x5f , 0x5d ); // POP EBX / POP ESI / POP EDI / POP EBP

i->emit( 0xc2 , 2 , 0 ); // RET 2

} else

i->emit( 0x5b , 0x5d , 0xc3 ); // POP EBX / POP EBP / RET

break ;

case command::store: // MOV [EBP+18+(imm-1)*4], dst

doffset = 0x18 +(i->cmd.imm- 1 )* 4 ;

if (i->known.count(i->cmd.dest)) {

i->emit( 0xc7 );

if (doffset< 128 )

i->emit( 0x45 , ( char )doffset);

else {

i->emit14( 0x85 , doffset);

}

i->emit4(i->known[i->cmd.dest]);

} else {

i->emit( 0x89 );

if (doffset< 128 )

i->emit( 0x45 |(i->cmd.dest- 1 )<< 3 , ( char )doffset);

else

i->emit14( 0x85 |(i->cmd.dest- 1 )<< 3 , doffset);

}

break ;

case command::jz:

joffset = i->tgt->offset - (i->offset+ 2 ); // JMP SHORT

jshort = i->tgt->offset && (joffset>=- 128 ); //

if (!i->cmd.dest) { // JMP off

if (jshort)

i->emit( 0xeb , ( char )joffset);

else {

i->emit( 0xe9 );

if (i->tgt->offset) //

i->emit4(joffset- 3 );

else {

i->needfixat = code.size();

i->emit4( 0 );

}

}

break ;

}

if (jshort && (i->cmd.dest== 2 )) { // JECXZ

i->emit( 0xe3 , ( char )joffset);

break ;

}

// OR dst, dst / JZ off

i->emit( 0x0b , 0xc0 |(i->cmd.dest- 1 )<< 3 |(i->cmd.dest- 1 ));

if (jshort && (joffset>=- 126 ))

i->emit( 0x74 , ( char )(joffset- 2 ));

else {

i->emit( 0x0f , 0x84 );

if (i->tgt->offset) //

i->emit4(joffset- 6 );

else {

i->needfixat = code.size();

i->emit4( 0 );

}

}

break ;

case command::echo: // PUSH live / PUSH dst / CALL [EBP+?] / ADD ESP, 4 / POP live

foreach(rp, i->onexitp) if (*rp!= 4 ) i->emit( 0x50 |(*rp- 1 ));

if (!i->cmd.dest) { // imm, [EBP+8]

if (regsize== 4 ) i->emit( 0x68 ); else i->emit( 0xbf );

i->needfixat = code.size();

i->emit4( 0 );

i->emit( 0xff , 0x55 , 2 *regsize);

} else {

if (i->known.count(i->cmd.dest)) { // imm, [EBP+4]

imm = i->known[i->cmd.dest];

if (regsize== 8 )

i->emit14( 0xbf , imm);

else if ((imm>=- 128 )&&(imm< 128 ))

i->emit( 0x6a , ( char )imm);

else

i->emit14( 0x68 , imm);

} else if (regsize== 4 ) // dst, [EBP+4]

i->emit( 0x50 |(i->cmd.dest- 1 ));

else

i->emit( 0x8b , 0xf8 |(i->cmd.dest- 1 ));

i->emit( 0xff , 0x55 , regsize);

}

if (regsize== 4 ) i->emit( 0x83 , 0xc4 , 4 );

foreachr(rp, i->onexitp) if (*rp!= 4 ) i->emit( 0x58 |(*rp- 1 ));

break ;

case command::mov: // MOV dst, imm

if (i->cmd.imm)

i->emit14( 0xb8 |(i->cmd.dest- 1 ), i->cmd.imm);

else // XOR dst, dst

i->emit( 0x33 , 0xc0 |(i->cmd.dest- 1 )<< 3 |(i->cmd.dest- 1 ));

break ;

case command::load: // MOV dst, [EBP+(3+i)*4]

doffset = 0x18 +(i->cmd.imm- 1 )* 4 ;

i->emit( 0x8b );

if (doffset< 128 )

i->emit( 0x45 |(i->cmd.dest- 1 )<< 3 , ( char )doffset);

else

i->emit14( 0x85 |(i->cmd.dest- 1 )<< 3 , doffset);

break ;

case command::input: // PUSH live / CALL [EBP+0] / XCHG EAX, dst / POP live

foreach(rp, i->onenterp) if (*rp!= 4 ) i->emit( 0x50 |(*rp- 1 ));

i->emit( 0xff , 0x55 , 0 );

if (i->cmd.dest!= 1 ) i->emit( 0x90 |(i->cmd.dest- 1 ));

foreachr(rp, i->onenterp) if (*rp!= 4 ) i->emit( 0x58 |(*rp- 1 ));

break ;

case command::add:

// 1 ; src2

if (i->known.count(i->cmd.src1) || (i->cmd.src2==i->cmd.dest))

std::swap(i->cmd.src1, i->cmd.src2);

if (!i->cmd.src2) // MOV dst, src1

i->emit( 0x8b , 0xc0 |(i->cmd.dest- 1 )<< 3 |(i->cmd.src1- 1 ));

else if (i->known.count(i->cmd.src2)) {

imm = i->known[i->cmd.src2];

addimm :

if (i->cmd.dest==i->cmd.src1) // ADD dst, imm

if (imm== 1 ) // INC dst

i->emit( 0xff , 0xc0 |(i->cmd.dest- 1 ));

else if (imm==- 1 ) // DEC dst

i->emit( 0xff , 0xc8 |(i->cmd.dest- 1 ));

else if ((imm>=- 128 )&&(imm< 128 ))

i->emit( 0x83 , 0xc0 |(i->cmd.dest- 1 ), ( char )imm);

else // for imm=128 we might use SUB Edst, -128

i->emit114( 0x81 , 0xc0 |(i->cmd.dest- 1 ), imm);

else // LEA dst, [src1+imm]

if ((imm>=- 128 )&&(imm< 128 ))

i->emit( 0x8d , 0x40 |(i->cmd.dest- 1 )<< 3 |(i->cmd.src1- 1 ), ( char )imm);

else

i->emit114( 0x8d , 0x80 |(i->cmd.dest- 1 )<< 3 |(i->cmd.src1- 1 ), imm);

} else if (i->cmd.dest==i->cmd.src1) // ADD dst, src2

i->emit( 0x03 , 0xc0 |(i->cmd.dest- 1 )<< 3 |(i->cmd.src2- 1 ));

else // LEA dst, [src1+src2]

i->emit( 0x8d , (i->cmd.dest- 1 )<< 3 | 4 , (i->cmd.src1- 1 )<< 3 |(i->cmd.src2- 1 ));

break ;

case command::sub: // ...

case command::mul: // ...

case command::div:

if (i->known.count(i->cmd.src2) && i->known[i->cmd.src2]== 2 ) {

if (i->cmd.dest!=i->cmd.src1) // MOV dst, src1 / SAR dst, 1

i->emit( 0x8b , 0xc0 |(i->cmd.dest- 1 )<< 3 |(i->cmd.src1- 1 ));

i->emit( 0xd1 , 0xf8 |(i->cmd.dest- 1 ));

break ;

}

// EAX,EDX;

// EDI,ESI,

// MOV EDI, EAX / MOV EAX, src1 / MOV ESI, EDX / XOR EDX, EDX

// IDIV src2 / XCHG dst, EAX / MOV EDX, ESI / MOV EAX, EDI

saveAX = i->onexitp.count((physreg) 1 ) && (i->cmd.dest!= 1 );

saveDX = i->onexitp.count((physreg) 3 ) && (i->cmd.dest!= 3 );

if (saveAX || (i->cmd.src2== 1 )) i->emit( 0x8b , 0xf8 );

if (i->cmd.src1!= 1 )

if (i->known.count(i->cmd.src1))

i->emit14( 0xb8 , i->known[i->cmd.src1]);

else

i->emit( 0x8b , 0xc0 |(i->cmd.src1- 1 ));

if (saveDX || (i->cmd.src2== 3 )) i->emit( 0x8b , 0xf2 );

i->emit( 0x33 , 0xd2 );

if (i->cmd.src2== 1 ) // EDI

i->emit( 0xf7 , 0xff );

else if (i->cmd.src2== 3 ) // ESI

i->emit( 0xf7 , 0xfe );

else

i->emit( 0xf7 , 0xf8 |(i->cmd.src2- 1 ));

if (i->cmd.dest!= 1 )

i->emit( 0x90 |(i->cmd.dest- 1 ));

if (saveDX) i->emit( 0x8b , 0xd6 );

if (saveAX) i->emit( 0x8b , 0xc7 );

break ;

case command::eq: case command::ne: case command::ge:

case command::le: case command::gt: case command::lt:

// 1 ; src2

if (i->known.count(i->cmd.src1)) {

std::swap(i->cmd.src1, i->cmd.src2);

switch (i->cmd.opcode) {

case command::ge: i->cmd.opcode = command::le; break ;

case command::le: i->cmd.opcode = command::ge; break ;

case command::gt: i->cmd.opcode = command::lt; break ;

case command::lt: i->cmd.opcode = command::gt; break ;

}

}

// CMP src1, src2 / SETcc dstL / MOVZX dst, dstL

if (i->known.count(i->cmd.src2)) {

imm = i->known[i->cmd.src2];

if ((imm>=- 128 )&&(imm< 128 ))

i->emit( 0x83 , 0xf8 |(i->cmd.src1- 1 ), ( char )imm);

else if (i->cmd.src1== 1 )

i->emit14( 0x3d , imm);

else

i->emit114( 0x81 , 0xf8 |(i->cmd.src1- 1 ), imm);

} else

i->emit( 0x3b , 0xc0 |(i->cmd.src1- 1 )<< 3 |(i->cmd.src2- 1 ));

i->emit( 0x0f );

switch (i->cmd.opcode) {

case command::eq: i->emit( 0x94 ); break ;

case command::ne: i->emit( 0x95 ); break ;

// ...

}

i->emit( 0xc0 |(i->cmd.dest- 1 ));

i->emit( 0x0f , 0xb6 , 0xc0 |(i->cmd.dest- 1 )<< 3 |(i->cmd.dest- 1 ));

break ;

default :

yyerror( "unknown opcode" );

}

}

// --

int offset = code.size();

std::vector< int > offsets(strings.size()+ 1 );

foreach(i, strings) {

offsets[i->second] = offset;

offset += i->first.length();

offset++;

}

// :

foreach(i, pcode) if (i->needfixat)

if (i->cmd.opcode==command::jz)

i->fix4(i->tgt->offset-(i->offset+i->length));

else if (i->cmd.opcode==command::echo)

i->fix4(offsets[i->cmd.imm]);



write( 1 , &*code.begin(), code.size()); //

foreach(i, strings) //

write( 1 , i->first.c_str(), i->first.length()+ 1 );









рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?



рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЛрдбрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:



[tyomitch@home ~]$ bison jsk.y

[tyomitch@home ~]$ c++ jsk.tab.c lex.yy.c -o jskc

[tyomitch@home ~]$ ./jskc < test.jsk > code

[tyomitch@home ~]$ cc jskld.c -o jskld

[tyomitch@home ~]$ ./jskld code

0 1000,

500? (1=, 2=, 3=) 1

249? (1=, 2=, 3=) 3

! !







рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рд╣реИ?

 00:55 рдЖрд░рдмреАрдкреА рдкреБрд╢ рдХрд░реЗрдВ
 01: 48 8b рдПрдлрдИ рдореВрд╡ рдЖрд░рдмреАрдкреА, рдЖрд░рдбреАрдЖрдИ
 04:39 rbx рдкреБрд╢ рдХрд░реЗрдВ
 05:33 c0 xor eax, eax
 07: b9 e8 03 00 00 mov ecx, 0x3e8
 0c: 50 рдкреБрд╢ рд░рдХреНрд╕
 0d: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 0e: bf 80 01 00 00 mov edi, 0x180
 13: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 16: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 17: 58 рдкреЙрдк рд░реИрдХреНрд╕
 18: 50 рдкреБрд╢ рд░рдХреНрд╕
 19: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 1a: bf 00 00 00 00 mov edi, 0x0
 1f: ff 55 08 рдХреЙрд▓ рдХреНрдпреВрдЯрд░ ptr [rbp + 0x8]
 22: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 23: 58 рдкреЙрдк рд░реИрдХреНрд╕
 24: 50 рдкреБрд╢ рд░рдХреНрд╕
 25: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 26: bf fa 00 00 00 mov edi, 0xfa
 2 рдмреА: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 2 рдИ: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 2f: 58 рдкреЙрдк рд░реИрдХреНрд╕
 30: 50 рдкреБрд╢ рд░рдХреНрд╕
 31: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 32: bf e8 03 00 00 mov edi, 0x3e8
 37: ff 55 08 рдХреЙрд▓ qword ptr [rbp + 0x8]
 3 рдП: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 3 рдмреА: 58 рдкреЙрдк рд░рдХреНрд╕
 3 рд╕реА: 50 рдкреБрд╢ рд░рдХреНрд╕
 3 рдбреА: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 3e: bf 01 01 00 00 mov edi, 0x101
 43: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 46: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 47: 58 рдкреЙрдк рд░реИрдХреНрд╕
 48: 3 рдмреА рд╕реА 1 рд╕реАрдПрдордкреА рдИрдПрдХреНрд╕рдПрдХреНрд╕, рдИрдПрдХреНрд╕рдПрдХреНрд╕
 4 рдП: 0 рдПрдл 9 рдИ рд╕реА 2 рд╕реЗрдЯрд▓ рдбреАрдПрд▓
 4d: 0f b6 d2 movzx edx, dl
 50: 0 рдмреА рдбреА 2 рдпрд╛ рдПрдбрдПрдХреНрд╕, рдПрдбрдПрдХреНрд╕
 52: 0f 84 97 00 00 00 0 рдЬреЗрдИрдПрдл
 рел lea: c рдбреА резрек режрез рд▓реЗрдЯреЗрдХреНрд╕, [рдЖрд░рд╕реАрдПрдХреНрд╕ + рд░рдХреНрд╕ * рез]
 5 рдмреА: рдбреА 1 рдПрдлрдП рд╕рд░ рдПрдбрдХреНрд╕, 1
 5d: 50 рдкреБрд╢ рд░рдХреНрд╕
 5e: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 5 рдПрдл: 52 рдкреБрд╢ рдЖрд░рдбреАрдПрдХреНрд╕
 60: bf bc 01 00 00 mov edi, 0x1bc
 65: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 68: 5 рдП рдкреЙрдк рдЖрд░рдбреАрдПрдХреНрд╕
 69: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 6a: 58 рдкреЙрдк рд░реИрдХреНрд╕
 6 рдмреА: 50 рдкреБрд╢ рд░рдХреНрд╕
 6 рд╕реА: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 6d: 52 рдкреБрд╢ rdx
 6e: 8b fa mov edi, edx
 70: ff 55 08 рдХреЙрд▓ qword ptr [rbp + 0x8]
 73: 5 рдП рдкреЙрдк рдЖрд░рдбреАрдПрдХреНрд╕
 74: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 75: 58 рдкреЙрдк рд░реИрдХреНрд╕
 76: 50 рдкреБрд╢ рд░рдХреНрд╕
 77: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 78: 52 рдкреБрд╢ рдЖрд░рдбреАрдПрдХреНрд╕
 79: bf 26 01 00 00 mov edi, 0x126
 7e: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 81: 5 рдП рдкреЙрдк рдЖрд░рдбреАрдПрдХреНрд╕
 82: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 83: 58 рдкреЙрдк рд░реИрдХреНрд╕
 84: 50 рдкреБрд╢ рд░рдХреНрд╕
 85: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 86: 52 рдкреБрд╢ рдЖрд░рдбреАрдПрдХреНрд╕
 87: ff 55 00 рдХреЙрд▓ qword ptr [rbp + 0x0]
 8a: 93 xchg рдИрдмреЗрдХреНрд╕, рдИрдПрдХреНрд╕рдПрдХреНрд╕
 8 рдмреА: 5 рдП рдкреЙрдк рдЖрд░рдбреАрдПрдХреНрд╕
 8 рд╕реА: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 8d: 58 рдкреЙрдк рд░реИрдХреНрд╕
 8e: 89 45 18 рдореВрд╡ рдбреЙрд░реНрдб ptr [rbp + 0x18], рдИрдПрдХреНрд╕рдПрдХреНрд╕
 91: 83 рдПрдлрдмреА 01 рд╕реАрдПрдордкреА рдИрдмреЗрдХреНрд╕, 0x1
 94: 0f 94 c0 рд╕реЗрдЯреА рдЕрд▓
 97: 0f b6 c0 movzx eax, рдЕрд▓
 9 рдП: 0 рдмреА рд╕реА 0 рдпрд╛ рдИрдИрдПрдХреНрд╕, рдИрдПрдХреНрд╕рдПрдХреНрд╕
 9 рд╕реА: 0 рдПрдл 84 08 00 00 00 рдЬреЗрдИ 0xaa
 a2: 8b 45 18 mov eax, dword ptr [rbp + 0x18]
 a5: 8d 4a ff lea ecx, [rdx-0x1]
 рдП 8: рдИрдм 9 рдИ рдЬреЗрдПрдордкреА 0x48
 рдЖ: aaрей рдПрдлрдмреА режреи рд╕реАрдПрдордкреА рдИрдмреЗрдХреНрд╕, реж рдПрдХреНрд╕ реи
 рд╡рд┐рдЬреНрдЮрд╛рдкрди: 0f 94 c0 sete al
 b0: 0f b6 c0 movzx eax, al
 b3: 0b c0 рдпрд╛ eax, eax
 рдмреА 5: 0f 84 04 00 00 00 рдЬреЗрдИ 0xbf
 рдмреА рдмреА: тАЛтАЛрежрей рд╕реА реи рдИрдПрдХреНрд╕, рдПрдбрдХреНрд╕ рдЬреЛрдбрд╝реЗрдВ
 рдмреАрдбреА: рдИрдмреЗ 89 рдЬреЗрдПрдордкреА 0x48
 bf: 8b 45 18 mov eax, dword ptr [rbp + 0x18]
 c2: 83 fb 03 рд╕реАрдПрдордкреА рдИрдмреЗрдХреНрд╕, 0x3
 c5: 0f 94 c2 sete dl
 c8: 0f b6 d2 movzx edx, dl
 cb: 0b d2 рдпрд╛ edx, edx
 cd: 0f 84 0b 00 00 00 je 0xde
 d3: bf a0 01 00 00 mov edi, 0x1a0
 d8: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 db: 5b рдкреЙрдк рдЖрд░рдмреАрдПрдХреНрд╕
 рдбреАрд╕реА: 5 рдбреА рдкреЙрдк рдЖрд░рдмреАрдкреА
 dd: c3 рд░рд┐рдЯ
 рдбреЗ: 50 рдкреБрд╢ рд░рдХреНрд╕
 df: 51 рдкреБрд╢ рдЖрд░рд╕реАрдПрдХреНрд╕
 e0: bf c4 01 00 00 mov edi, 0x1c4
 e5: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 e8: 59 рдкреЙрдк рдЖрд░рд╕реАрдПрдХреНрд╕
 e9: 58 рдкреЙрдк рд░рдХреНрд╕
 ea: e9 59 ff ff ff jmp 0x48
 ef: bf 59 01 00 00 mov edi, 0x159
 f4: ff 55 10 рдХреЙрд▓ qword ptr [rbp + 0x10]
 f7: 5b рдкреЙрдк рдЖрд░рдмреАрдПрдХреНрд╕
 f8: 5d рдкреЙрдк рдЖрд░рдмреАрдкреА
 f9: c3 рд░рд┐рдЯ


рдирдЧреНрди рдЖрдВрдЦреЛрдВ рд╕реЗ рдЖрдк рдХрдо рд╕реЗ рдХрдо рджреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЕрдиреБрдХреВрд▓рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЯреАрдо рдХреЗ рд▓рд┐рдП "рдЖрдВрдЦ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдпрд╣ "рдмрдбрд╝реА peephole рдЕрдиреБрдХреВрд▓рди" рд╣реИ рдЬреЛ рд╣рдо рдЕрдЧрд▓реА рдмрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╢реЗрд╖ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдИрдПрд▓рдПрдл рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдореЗрдХрд╢рд┐рдлреНрдЯ рдмреВрдЯрд▓реЛрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред



All Articles