рдпрд╣рд╛рдВ рдХреЛрдИ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд╣реАрдВ рд╣реИрдВ: рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ, рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдЧреЗ:
- рдХреЛрдб рдЪрдпрди
- рд▓реЛрдбрд░
- рдкреА рдХреЛрдб рдмрджрд▓рддрд╛ рд╣реИ
- рдкреАрдврд╝реА
- рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?
рдХреЛрдб рдЪрдпрди
рдореИрдВ рдпрд╣ рдорд╛рдирдХрд░ рдЪрд▓рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдПрдХ рдРрд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ 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 рд░рд┐рдЯ
рдирдЧреНрди рдЖрдВрдЦреЛрдВ рд╕реЗ рдЖрдк рдХрдо рд╕реЗ рдХрдо рджреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЕрдиреБрдХреВрд▓рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЯреАрдо рдХреЗ рд▓рд┐рдП "рдЖрдВрдЦ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
- рдЬрдм рдХреЛрдИ рдЖрджреЗрд╢
POP reg
рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░PUSH reg
рдореЗрдВ рдЕрдЧрд▓рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрди рджреЛрдиреЛрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; - рд╕рдВрдпреЛрдЬрди
SETcc regl / MOVZX reg, regl / OR reg, reg / JZ offset
рдХреЛJZ
рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЬреАрд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдПрдХрд▓JNcc offset
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред