рдлреЛрд░реНрдЯ рдмрд╛рдЗрдЯ рдХрд╛рд░ (рдФрд░ рдЕрдзрд┐рдХ) рдореВрд▓ рдЕрдореЗрд░рд┐рдХреА

рдЫрд╡рд┐

рд╣рд╛рдВ, рд╣рд╛рдВ, рдпрд╣ "рдмрд╛рдЗрдЯ" рд╣реИ рдФрд░ рдпрд╣ рднрд╛рд░рддреАрдп (рднрд╛рд░рддреАрдп рдирд╣реАрдВ) рдореЗрдВ рд╣реИред рдореИрдВ рдХреНрд░рдо рдореЗрдВ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣реИрдмреЗ рдкрд░, рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧреЗред рдФрд░ рдПрдХ рдмрд╛рд░, рдореБрдЭреЗ рдлреЛрд░реНрдЯ рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдордЬрд╝рд╛ рдЖрдпрд╛ред рдмреЗрд╢рдХ, рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВред рд╡реЗ 16-рдмрд┐рдЯ рдереЗред рдореИрдВрдиреЗ x86-64 рдкрд░ рдХрднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред 32 рдХреЗ рд╕рд╛рде рднреА рдирд╣реАрдВ рдЦреЗрд▓ рд╕рдХреЗред рддреЛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ - рдХреНрдпреЛрдВ рдирд╣реАрдВ? 64-рдмрд┐рдЯ рдХрд┐рд▓реЗ рдХреЛ рдХреНрдпреЛрдВ рди рд╣рд┐рд▓рд╛рдПрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╛рдИрдЯрдХреЛрдб рдХреЗ рд╕рд╛рде рднреА рдХреНрдпреЛрдВ рдирд╣реАрдВ? рд╣рд╛рдВ, рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдХреБрдЫ рднреА рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдерд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реЛрдо рд╕рд░реНрд╡рд░ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╕рд╛ googled рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ GAS рдФрд░ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рд░реНрд╡рд░ рд╕реЗ SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ, рдЯрд╛рдЗрдк рдХрд░ рд░рд╣рд╛ рд╣реВрдБ - рд╣рд╛рдБ! рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдЕрднреА рднреА рдПрдХ рд▓рд┐рдВрдХрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЯрд╛рдЗрдк рдХрд░реЗрдВ ld - рд╣рд╛рдБ! рдЗрд╕рд▓рд┐рдП, рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╕рднреНрдпрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдХреЗрд╡рд▓ рдПрдХ рдЬрдВрдЧрд▓, рдЕрд╕рд▓реА рднрд╛рд░рддреАрдпреЛрдВ рдХреА рддрд░рд╣ :) рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдХреЗ рдмрд┐рдирд╛, рдХреЗрд╡рд▓ рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдФрд░ рдорд┐рдбрдирд╛рдЗрдЯ рдХрдорд╛рдВрдбрд░ред рд╕рдВрдкрд╛рджрдХ рдиреИрдиреЛ рд╣реЛрдЧрд╛, рдЬреЛ рдореЗрд░реЗ f4 рдкрд░ mc рдореЗрдВ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред рд╕рдореВрд╣ "рдЬреАрд░реЛ" рдЧрд╛рдирд╛ рдХреИрд╕рд╛ рд╣реИ? рдПрдХ рд╕рдЪреНрдЪреЗ рднрд╛рд░рддреАрдп рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ... рдПрдХ рд╕рдЪреНрдЪреЗ рднрд╛рд░рддреАрдп рдХреЛ рдФрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рдмреЗрд╢рдХ, рдПрдХ рдбрд┐рдмрдЧрд░ред рд╣рдо рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ gdb - рд╣реИ! рдЦреИрд░, Shift + F4 рджрдмрд╛рдПрдВ, рдФрд░ рдЬрд╛рдПрдВ!

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


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

рдЖрдЗрдП рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕реНрдЯреИрдХреНрдб рдмрд╛рдЗрдЯ рдорд╢реАрди (рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдЬреЗрдЖрдИрдЯреА) рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ 256 рдкрддреЗ рд╣реЛрдВрдЧреЗ - рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдПред рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдХрдо - рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ, рдпрд╣ 1-2 рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рд╣реИред рдФрд░ рд╣рдореЗрдВ рдЬрд▓реНрджреА рдЪрд╛рд╣рд┐рдП, рдмрд┐рдирд╛ рд╕рдордЭреМрддрд╛ рдХрд┐рдПред

рдвреЗрд░


рдЖрдорддреМрд░ рдкрд░, рдлреЛрд░реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ (* рдПрд╕рдкреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлреЛрд░реНрдЯ рд╕рд┐рд╕реНрдЯрдо рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рдХреЛ рдЕрдиреНрдп рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рд╣рдорд╛рд░реА рдорд╢реАрди рдЦрдбрд╝реА рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдореБрдЦреНрдп рдХрд╛рдо рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ рдкрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЪрд▓реЛ рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ - рдЖрд░рдПрд╕рдкреА рдПрдХ рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ рд╣реЛрдЧрд╛ред рдареАрдХ рд╣реИ, рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рдХреЛ RBP рд╣реЛрдиреЗ рджреЗрдВ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕реНрдЯреИрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рд╣реЛрдВрдЧреЗ: рдПрдХ рдХреЛрдб рд╕реЗрдЧрдореЗрдВрдЯ, рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдЧрдореЗрдВрдЯ рдФрд░ рдПрдХ рд╕реНрдЯреИрдХ рд╕реЗрдЧрдореЗрдВрдЯ (рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рджреЛрдиреЛрдВ рд╣реЛрдВрдЧреЗ)ред

рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ


рдореИрдВ рд░рдЬрд┐рд╕реНрдЯрд░ x86-64 рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рддрд╛ рд╣реВрдВ, рдФрд░ рдЙрдлрд╝! 32 рдпрд╛ 16 рдмрд┐рдЯ рдореЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 8 рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рд░рдЬрд┐рд╕реНрдЯрд░ (R8 - R16) рд╣реИрдВ, рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрдп рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ RSP рдФрд░ RBP рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЕрднреА рднреА bytecode рдХрдорд╛рдВрдб рдХреЗ рдкреЙрдЗрдВрдЯрд░ (рдХрд╛рдЙрдВрдЯрд░) рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреА, рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рд░реАрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рд░рдЬрд┐рд╕реНрдЯрд░ (RAX, RBX, RCX, RDX, RSI, RDI) рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рдХрдИ рд╡рд┐рд╢реЗрд╖ рдХрдорд╛рдВрдб рд╣реИрдВред рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ, рдФрд░ рдмрд╛рдИрдЯрдХреЛрдб рдирд┐рд░реНрджреЗрд╢ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рд╣рдо рдореЗрд░реЗ рд▓рд┐рдП рдирдП рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ R8 рд╣реЛрдиреЗ рджреЗрдВред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдореБрдЭреЗ рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рдорд╛рдкреНрдд "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛" рдкрд╛рдПрдВрдЧреЗред рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдПрдХ рдЕрдЬреАрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓рд╛ рдЬрд╣рд╛рдВ рд╕реНрд░реЛрдд рдФрд░ рд░рд┐рд╕реАрд╡рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдПрдЯреА рдПрдВрдб рдЯреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рдФрд░ рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░ рдЬреАрдПрдПрд╕ рдХреЗ рддрд╣рдд рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЗрдВрдЯреЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рднреА рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЦреИрд░, .intel_syntax noprefix рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦреЗрдВред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛" рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдорджрдж рдФрд░ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкрдврд╝рдХрд░, рдореИрдВрдиреЗ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛:
$ as fort.asm -o fort.o -g -ahlsm >list.txt
рдпрд╣рд╛рдБ, -o рд╕реНрд╡рд┐рдЪ рдкрд░рд┐рдгрд╛рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, -g рд╕реНрд╡рд┐рдЪ рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рдФрд░ -рд╣рд▓реНрд╕рдо рд╕реНрд╡рд┐рдЪ рд╕реВрдЪреА рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдореИрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рд░рдЦрддрд╛ рд╣реВрдВ, рдЗрд╕рдореЗрдВ рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ, рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВрдиреЗ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдирд╣реАрдВ рдХреА, рдФрд░ -g рд╕реНрд╡рд┐рдЪ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдбрд┐рдмрдЧрд░ рдХреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж -g рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ :)

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд▓рд┐рдВрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ:

$ ld forth.o -o forth
рдЕрдЪреНрдЫрд╛, рднрд╛рдЧреЛ!
$ ./forth
Hello, world!

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдерд╛ред рдЪрдореЗрд▓реА (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛ рд╣реИ!', рдмреЗрд╢рдХ)
 .intel_syntax noprefix .section .data msg: .ascii "Hello, world!\n" len = . - msg #  len    .section .text .global _start #     _start: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, OFFSET FLAT:msg #     mov edx, len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit xor ebx, ebx #    0 int 0x80 #   

рд╡реИрд╕реЗ, рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ x86-64 рдореЗрдВ int 0x80 рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд▓рд┐рдП syscall рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред рдЗрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП 0x80 рдХреЙрд▓ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╣реИред

рдПрдХ рд╢реБрд░реБрдЖрдд рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдЕрдм ...

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!


рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА, рд╣рдо рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХрд╛ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗред рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ 0 рд▓рдЧрд╛рддреЗ рд╣реБрдП рдЗрд╕реЗ рдлреЛрд░реНрдЯ рд╢рдмреНрдж "0" рд╣реЛрдиреЗ рджреЗрдВ:

 bcmd_num0: push 0 jmp _next 

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

рд▓реЗрдХрд┐рди ... рдмрд╛рдЗрдЯ-рдХрдорд╛рдВрдб рдПрдбреНрд░реЗрд╕ рдЯреЗрдмрд▓ рдХрд┐рддрдиреА рдЧрд╣рд░реА рд╣реЛрдЧреА? рддрдм рдореБрдЭреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдирдП x86-64 рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрд╣реБрдд рдЦреБрджрд╛рдИ рдХрд░рдиреА рдкрдбрд╝реАред рдХрд╛рд╢, рдореБрдЭреЗ рдРрд╕реЗ рдЖрджреЗрд╢ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдСрдлрд╝рд╕реЗрдЯ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рддреЛ, рдпрд╛ рддреЛ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдпрд╛ рдкрддрд╛ рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ - 64 рдмрд┐рдЯреНрд╕ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ - 64 рдмрд┐рдЯреНрд╕ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ 256 * 8 = 4096 рдмрд╛рдЗрдЯ рд╣реЛрдЧрд╛ред рдареАрдХ рд╣реИ, рдЕрдВрдд рдореЗрдВ, _next рдХреЙрд▓ рдПрдирдХреЛрдб рдХрд░реЗрдВ:

 _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] # bcmd -   - 

рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ ... рдХреЗрд╡рд▓ рддреАрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдЬрдм рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╕реЗ рджреВрд╕рд░реЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рдЖрдЬреНрдЮрд╛рдПрдБ рдореЗрд░реЗ рд▓рд┐рдП рдЗрддрдиреА рдЖрд╕рд╛рди рдирд╣реАрдВ рдереАрдВред рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ 0x86-64 рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ MOVZX рдХрдорд╛рдВрдб рдвреВрдВрдврдирд╛ рдкрдбрд╝рд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХрдорд╛рдВрдб 64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ 8, 16 рдпрд╛ 32 рдмрд┐рдЯреНрд╕ рдХреЗ рдорд╛рди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрдорд╛рдВрдб рдХреЗ рджреЛ рд╡реЗрд░рд┐рдПрдВрдЯ рд╣реИрдВ: рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд, рдЬрд╣рд╛рдВ рдЙрдЪреНрдЪ рдЕрдВрдХ рд╢реВрдиреНрдп рд╕реЗ рдЧрджреНрджреЗрджрд╛рд░ рд╣реИрдВ, рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд MOVSX рд╣реИред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╕рд╛рдЗрди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╢реВрдиреНрдп рдЙрдЪреНрдЪ рдЕрдВрдХреЛрдВ рдореЗрдВ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реИред

рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рддреЗрдЬ рд╣реИ? рд╢рд╛рдпрдж рдХреЛрдИ рдФрд░ рднреА рддреЗрдЬреА рд╕реЗ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛?

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

рд╣рдо рдПрдХ рдмрд╛рдп рдХрдорд╛рдВрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╣реЗрд▓реЛ, рд╡рд░реНрд▓реНрдб!"

 bcmd_bye: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bye #     mov edx, msg_bye_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 0 #    0 int 0x80 #   

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдмрд╛рдЗрдЯ-рдХрдорд╛рдВрдб рдПрдбреНрд░реЗрд╕ рдЯреЗрдмрд▓ рдмрдирд╛рдирд╛ рд╣реИ, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдФрд░ рдмрд╛рдЗрдЯ-рдорд╢реАрди рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред рддреЛ ... рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 256 рдорд╛рди рд╣реИрдВ, рдФрд░ рджреЛ рдЖрджреЗрд╢ рд╣реИрдВред рдЕрдиреНрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?
рдмрд╛рдХреА рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЛрдб рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЖрдк рдЗрд╕ рдкрд░ рдПрдХ рдЪреЗрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯреАрдо рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддреАрди рд╣реИрдВ, рдФрд░ рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдпрд╣ рдкрд╛рдВрдЪ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реНрдЯрдм рдХрдорд╛рдВрдб - рдПрдХ рдмреБрд░реА рдЯреАрдо рдмрдирд╛рдПрдВрдЧреЗред рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рднрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрдкрдпреЛрдЧреА рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЦрд░рд╛рдм рдЯреАрдо рдХрд╛ рдХреЛрдб 0x00 рд╣реИ, рдмрд╛рдИ рдЯреАрдо рдХрд╛ 0x01 рд╣реЛрдЧрд╛, рдФрд░ '0' рдХрд╛ рдХреЛрдб 0x02 рд╣реЛрдЧрд╛, рдПрдХ рдмрд╛рд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд╛ рд╣реБрдЖ рд╣реИред рдЕрдм рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рдЯреАрдо рдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ рдХреЛрдб рдФрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде (рдореИрдВ рдЗрд╕реЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдореЗрдВ рдбрд╛рд▓ рджреВрдВрдЧрд╛, рд▓рдЧрднрдЧ рдЕрд▓рд╡рд┐рджрд╛ рдХреЗ рд╕рдорд╛рди):

bcmd_bad
 bcmd_bad: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bad_byte #     mov edx, msg_bad_byte_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 1 #    1 int 0x80 #   
рдЕрдм рдкрддреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЖрда рдЬрдЧрд╣ рджреЗрдВрдЧреЗ, 16 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреАред рддрд╛рд▓рд┐рдХрд╛ рдЖрдХрд╛рд░ рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ:

рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдПрдбреНрд░реЗрд╕ рдЯреЗрдмрд▓
 bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad 
рд╣рдо рдмрд╛рдЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдмреЙрдбреА рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛрдб рдХреЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдЪрд░ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдордЭреМрддреЗ рдХрд░реЗрдВрдЧреЗ:

  • рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддреЗ bcmd_ рдкрд░ рд╢реБрд░реВ рд╣реЛрдВрдЧреЗ
  • рдХрдорд╛рдВрдб рдХреЛрдб рд╕реНрд╡рдпрдВ b_ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрд╛рдЗрдЯ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╢рд░реАрд░ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

 start: .byte b_bye 

рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕реНрдЯреИрдХ_рд╕рд╛рдЗрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред рдЗрд╕реЗ рдЕрднреА рддрдХ 1024 рд╣реЛрдиреЗ рджреЗрдВред рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рдордп, рд╣рдо RBP = RSP - stack_size рдХрд░реЗрдВрдЧреЗред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдРрд╕рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИред
 .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte #  len    msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_bye .section .text .global _start #     _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_bad = 0x00 bcmd_bad: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bad_byte #     mov edx, msg_bad_byte_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 1 #    1 int 0x80 #   b_bye = 0x01 bcmd_bye: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bye #     mov edx, msg_bye_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 0 #    0 int 0x80 #   b_num0 = 0x02 bcmd_num0: push 0 jmp _next 


рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдЪрд▓рд╛рдПрдВ:

$ as fort.asm -o fort.o -g -ahlsm >list.txt
$ ld forth.o -o forth
$ ./forth
bye!

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдПрдХ рдмрд╛рдЗрдЯ рд╕реЗ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ :)
рдмреЗрд╢рдХ, рдпрд╣ рдРрд╕рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ:

$ ./forth


рдмреЗрд╢рдХ, рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрдпрд╛ рд╣реВрдВред рдФрд░ рд╣рдореЗрдВ рдбрд┐рдмрдЧрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

 $ gdb ./forth GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./forth...done. (gdb) 

рдЕрдЧрд▓рд╛, рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рдХреЗ, рд╣рдо рдбрд┐рдмрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдб рдЦреЛрдЬрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдШрдВрдЯреЗ рдереЗред рдпрд╣рд╛рдБ рд╡реЗ рд╣реИрдВ:
b <рд▓реЗрдмрд▓> - рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░реЗрдВ
l <рд▓реЗрдмрд▓> - рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦреЗрдВ
r - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯ рдпрд╛ рд░рд┐рд╕реНрдЯрд╛рд░реНрдЯ рдХрд░реЗрдВ
ir - рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрдерд┐рддрд┐ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ
рдПрд╕ - рдХрджрдо

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

рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╣реБрдд рдХрдо рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕реЗ "рд╣реИрд▓реЛ" рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣ рддреБрд░рдВрдд "рдмрд╛рдп!" рдХрд╣рддреА рд╣реИред рдЪрд▓реЛ рдЕрд╕рд▓реА "рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛!" bytecode рдкрд░ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреИрдХ рдкрд░ рдкрддрд╛ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдбрд╛рд▓реЗрдВ, рдлрд┐рд░ рдЙрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдмрд╛рдп рдХрдорд╛рдВрдбред рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирдП рдХрдорд╛рдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рдФрд░ рд▓рдВрдмрд╛рдИ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓рд╛рдпрд╛ рдЬрд╛рдПред рдкрд╣рд▓реЗ рд╣рдо рдЯрд╛рдЗрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдХреЛрдб 0x80 рд╣реИред рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ, sys_write рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдЙрд╕ рдЯреБрдХрдбрд╝реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 b_type = 0x80 bcmd_type: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout pop rdx pop rcx push r8 int 0x80 #   pop r8 jmp _next 

рдпрд╣рд╛рдВ рд╣рдо рдкреАрдУрдкреА рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ рд╕реЗ рдкрддрд╛ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд▓реЗрддреЗ рд╣реИрдВред Int 0x80 рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ R8 рдХрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХреА рдЧрдИред рдЕрдм рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдмрд╛рдЗрдЯ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЦреБрдж рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИ - рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрдорд╛рдВрдб рдмрдирд╛рдПрдВрдЧреЗред рдпреЗ lit8, lit16, lit32 рдФрд░ lit64 рд╣реЛрдВрдЧреЗред рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо lit8 рдФрд░ lit16 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП - lit32 рдФрд░ lit64ред рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдХрдорд╛рдВрдб рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ! .. рд╣рдо рдЗрди рдХрдорд╛рдВрдбреЛрдВ рдХрд╛ рдХреЛрдб 0x08 - 0x0B рдмрдирд╛рдПрдВрдЧреЗред

 b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next 

рдпрд╣рд╛рдВ рд╣рдо MOVSX рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ MOVZX рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рдЖрдЗрдХреЙрдирд┐рдХ рд╡рд░реНрдЬрди рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИред R8 рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХрд╛рдЙрдВрдЯрд░ рд╣реИред рд╣рдо рдЙрд╕ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдХрдорд╛рдВрдб рдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдореВрд▓реНрдп рдХреЛ 64 рдмрд┐рдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рд╡рд╛рдВрдЫрд┐рдд рдкрджреЛрдВ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирдИ рдЯреАрдореЛрдВ рдХреЗ рдкрддреЗ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВред

рдпрд╣ рд╕рдм рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!" рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд╣рдорд╛рд░реЗ bytecode рдкрд░ред рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ! :)

 start: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_bye 

рд╣рдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд┐рдЯ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: lit64, рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛, рдФрд░ lit8, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рд▓рдВрдмрд╛рдИ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рджреЛ рдФрд░ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдкреНрд░рдХрд╛рд░ рдФрд░ рдЕрд▓рд╡рд┐рджрд╛ред
рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдЪрд▓рд╛рдПрдВ:

 $ as fort.asm -o fort.o -g -ahlsm >list.txt $ ld forth.o -o forth $ ./forth Hello, world! bye! 

рд╣рдорд╛рд░реЗ bytecode рдЕрд░реНрдЬрд┐рдд! рдпрд╣ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреВрд░реНрдг рд╕реНрд░реЛрдд
 .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte #  len    msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x00 .quad bcmd_lit8, bcmd_lit16, bcmd_lit32, bcmd_lit64, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x10 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x20 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x30 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x40 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x60 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_type, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_bye .section .text .global _start #     _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_bad = 0x00 bcmd_bad: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bad_byte #     mov edx, msg_bad_byte_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 1 #    1 int 0x80 #   b_bye = 0x01 bcmd_bye: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bye #     mov edx, msg_bye_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 0 #    0 int 0x80 #   b_num0 = 0x02 bcmd_num0: push 0 jmp _next b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next b_type = 0x80 bcmd_type: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout pop rdx pop rcx push r8 int 0x80 #   pop r8 jmp _next 


рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЕрднреА рднреА рдмрд╣реБрдд рдЖрджрд┐рдо рд╣реИрдВ, рдЖрдк рдПрдХ рд╕реНрдерд┐рддрд┐, рдПрдХ рдЪрдХреНрд░ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред

рдпрд╣ рдХреИрд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИ? рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд╣рд╛рде рдореЗрдВ рд╣реИ! рдЖрдЗрдП рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЛ 10 рдмрд╛рд░ рд▓реВрдк рдореЗрдВ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдХрдорд╛рдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╕рд╛рде рд╣реА рд╕реНрдЯреИрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рдПрдХ рдмрд┐рдЯ: 1 (рдлреЛрд░реНрдЯ "1-") рдФрд░ рдПрдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рджреЛрд╣рд░рд╛рд╡ рдХрдорд╛рдВрдб ("рдбреБрдмрдХреА") рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреИрдХ рдкрд░ рдореВрд▓реНрдп рдХрдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдХрдорд╛рдВрдбред

рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдореИрдВ рднреА рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛:

 b_dup = 0x18 bcmd_dup: push [rsp] jmp _next b_wm = 0x20 bcmd_wm: decq [rsp] jmp _next 

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

рдереЛрдбрд╝реА рдЧрд╣рд░рд╛рдИ? рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, 8 рдмрд┐рдЯреНрд╕ (127 рдлреЙрд░рд╡рд░реНрдб / рдмреИрдХрд╡рд░реНрдб) рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд▓рд┐рдЯ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗ, рд╣рдо рджреЛ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдПрдВрдЧреЗ - 8 рдФрд░ 16 рдЕрдВрдХ, рдХрдорд╛рдВрдб рдХреЛрдб 0x10 рдФрд░ 0x11 рд╣реЛрдЧрд╛:

 b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next 
рдЕрдм рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рд╕реНрдЯреИрдХ 0 рд╣реИ, рддреЛ _next рдкрд░ рдЬрд╛рдПрдВ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╢рд╛рдЦрд╛ рдХрдорд╛рдВрдб рдкрд░ рдЬрд╛рдПрдВ!
 b_qbranch8 = 0x12 bcmd_qbranch8: pop rax or rax, rax jnz bcmd_branch8 inc r8 jmp _next b_qbranch16 = 0x13 bcmd_qbranch16: pop rax or rax, rax jnz bcmd_branch16 add r8, 2 jmp _next 
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╣реИ:
 start: .byte b_lit8 .byte 10 #  #  m0: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye 

рдкрд╣рд▓реЗ рджреЛ рдХрдорд╛рдВрдб - рд╣рдордиреЗ рд╕реНрдЯреИрдХ рдкрд░ рд▓реВрдк рдХрд╛рдЙрдВрдЯрд░ рд▓рдЧрд╛рдпрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ рд╣реИрд▓реЛред рдлрд┐рд░ рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рд╕реЗ 1 рдШрдЯрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рджреЛрд╣рд░рд╛рд╡ рдХрдорд╛рдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдХрдорд╛рдВрдб рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗ рдорд╛рди рд▓реЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕рдВрдХреНрд░рдордг рдЖрда-рдмрд┐рдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд░реА рдХреЗрд╡рд▓ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рд╣реИред

рд╣рдо рдПрдХ рдЯреЗрдмрд▓ рдореЗрдВ рдирдП рдХрдорд╛рдВрдб рдХреЗ рдкрддреЗ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕реЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рджреВрдВрдЧрд╛, рдЕрдиреНрдпрдерд╛ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реЛ рдЧрдпрд╛ рд╣реИ)
 $ as fort.asm -o fort.o -g -ahlsm >list.txt $ ld forth.o -o forth $ ./forth Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! bye! 


рдЦреИрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЪрдХреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рдкреВрд░реНрдг рд╕реНрд░реЛрдд
 .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte #  len    msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x00 .quad bcmd_lit8, bcmd_lit16, bcmd_lit32, bcmd_lit64, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_branch8, bcmd_branch16, bcmd_qbranch8, bcmd_qbranch16, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x10 .quad bcmd_dup, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_wm, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x20 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x30 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x40 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x60 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_type, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_lit8 .byte 10 #  #  m0: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye .section .text .global _start #     _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_bad = 0x00 bcmd_bad: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bad_byte #     mov edx, msg_bad_byte_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 1 #    1 int 0x80 #   b_bye = 0x01 bcmd_bye: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bye #     mov edx, msg_bye_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 0 #    0 int 0x80 #   b_num0 = 0x02 bcmd_num0: push 0 jmp _next b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next b_type = 0x80 bcmd_type: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout pop rdx pop rcx push r8 int 0x80 #   pop r8 jmp _next b_dup = 0x18 bcmd_dup: push [rsp] jmp _next b_wm = 0x20 bcmd_wm: decq [rsp] jmp _next b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next b_qbranch8 = 0x12 bcmd_qbranch8: pop rax or rax, rax jnz bcmd_branch8 inc r8 jmp _next b_qbranch16 = 0x13 bcmd_qbranch16: pop rax or rax, rax jnz bcmd_branch16 add r8, 2 jmp _next 

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

рд╣рдо рдХрд╛рдо рдХреЛ рдЕрдВрдд рддрдХ рд▓рд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдкрд╣рд▓реА рдмрд╛рд░ рд╣рдореЗрдВ рд░рд┐рдЯрд░реНрди рдХреЗ рдвреЗрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИред рджреЛ рдЖрджреЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдХреЙрд▓ рдХрдорд╛рдВрдб рдФрд░ рд░рд┐рдЯрд░реНрди рдХрдорд╛рдВрдб (рдХреЙрд▓ рдФрд░ рдирд┐рдХрд╛рд╕)ред

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

 b_call8 = 0x0C bcmd_call8: movsx rax, byte ptr [r8] sub rbp, 8 inc r8 mov [rbp], r8 add r8, rax jmp _next b_call16 = 0x0D bcmd_call16: movsx rax, word ptr [r8] sub rbp, 8 add r8, 2 mov [rbp], r8 add r8, rax jmp _next b_call32 = 0x0E bcmd_call32: movsx rax, dword ptr [r8] sub rbp, 8 add r8, 4 mov [rbp], r8 add r8, rax jmp _next 

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

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

рдЕрдм рд╡рд╛рдкрд╕реА рдХреА рдЖрдЬреНрдЮрд╛ред рджрд░рдЕрд╕рд▓, рдЙрд╕рдХрд╛ рдХрд╛рдо рдХреЗрд╡рд▓ R8 рдХреЛ рд╕реНрдЯреИрдХ рд╕реЗ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ:

 b_exit = 0x1F bcmd_exit: mov r8, [rbp] add rbp, 8 jmp _next 

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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ _next рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рдКрдкрд░ рд░рдЦреЗрдВ:

 b_exit = 0x1F bcmd_exit: mov r8, [rbp] add rbp, 8 _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] 

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

  262 0084 490FBE00 bcmd_lit8: movsx rax, byte ptr [r8] 263 0088 49FFC0 inc r8 264 008b 50 push rax 265 008c EB90 jmp _next 266 267 b_lit16 = 0x09 268 008e 490FBF00 bcmd_lit16: movsx rax, word ptr [r8] 269 0092 4983C002 add r8, 2 270 0096 50 push rax 271 0097 EB85 jmp _next 272 273 b_lit32 = 0x0A 274 0099 496300 bcmd_lit32: movsx rax, dword ptr [r8] 275 009c 4983C004 add r8, 4 276 00a0 50 push rax 277 00a1 E978FFFF jmp _next 277 FF 278 

рдпрд╣рд╛рдВ, рд▓рд╛рдЗрди 265 рдФрд░ 271 рдкрд░, рдЬреЗрдПрдордкреА рдХрдорд╛рдВрдб 2 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рд▓рд╛рдЗрди 277 рдкрд░, рдПрдХ рд╣реА рдХрдорд╛рдВрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 5 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдВрдк рджреВрд░реА рд╢реЙрд░реНрдЯ рдХрдорд╛рдВрдб рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

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

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

 start: .byte b_lit8 .byte 3 #  #  m0: .byte b_call16 .word sub_hello - . - 2 .byte b_call16 .word sub_hello - . - 2 .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye sub_hello: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_exit 

рдХреЙрд▓ 8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЙрд▓ 16 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реИрд▓реНрдпреВ 2 рдХреЛ рдЙрд╕ рдХреЙрд▓ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЗ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ред рдХреЙрд▓ 8 рдХреЗ рд▓рд┐рдП, 1 рдХреЛ рдХреНрд░рдорд╢рдГ
рдХреЙрд▓ 32 рдХреЗ рд▓рд┐рдП рдШрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, 4. рд╣рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:

 $ as forth.asm -o forth.o -g -ahlsm>list.txt $ ld forth.o -o forth $ ./forth Hello, world! Bad byte code! 

рдУрд╣ ... рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ :) рдЦреИрд░, рд╣рдо GDB рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рддреБрд░рдВрдд bcmd_exit рдкрд░ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рдм_рд╣реЗрд▓реНрд▓реЛ рдХреЙрд▓ рдкрд╛рд╕ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рдХрд╛рдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ ... рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ ... рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдиреЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рд╣рд┐рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рддреБрд░рдВрдд рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЛрдб рдХрд╛ рд╕рдВрджреЗрд╣ рдерд╛ред рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЙрд╕рдореЗрдВ рдерд╛ред b_exit I рдиреЗ рдорд╛рди 0x1f рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛, рдФрд░ рдкрддрд╛ рд╕реНрд╡рдпрдВ рддрд╛рд▓рд┐рдХрд╛ рдХрдХреНрд╖ рд╕рдВрдЦреНрдпрд╛ 0x17 рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдареАрдХ рд╣реИ, рддреЛ рдореИрдВ 0x17 рдХреЛ b_exit рдХреЗ рдорд╛рди рдХреЛ рд╕рд╣реА рдХрд░реВрдВрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛:

 $ as forth.asm -o forth.o -g -ahlsm>list.txt $ ld forth.o -o forth $ ./forth Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! bye! 

рдмрд┐рд▓реНрдХреБрд▓ рдЫрд╣ рдмрд╛рд░ рдирдорд╕реНрдХрд╛рд░, рдФрд░ рдПрдХ рдмрд╛рд░ рдЕрд▓рд╡рд┐рджрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :)

рдкреВрд░реНрдг рд╕реНрд░реЛрдд
 .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte #  len    msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x00 .quad bcmd_lit8, bcmd_lit16, bcmd_lit32, bcmd_lit64, bcmd_call8, bcmd_call16, bcmd_call32, bcmd_bad .quad bcmd_branch8, bcmd_branch16, bcmd_qbranch8, bcmd_qbranch16, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_exit # 0x10 .quad bcmd_dup, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_wm, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x20 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x30 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x40 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x60 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_type, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_lit8 .byte 3 #  #  m0: .byte b_call16 .word sub_hello - . - 2 .byte b_call16 .word sub_hello - . - 2 .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye sub_hello: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_exit .section .text .global _start #     _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next b_exit = 0x17 bcmd_exit: mov r8, [rbp] add rbp, 8 _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_num0 = 0x02 bcmd_num0: push 0 jmp _next b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_call8 = 0x0C bcmd_call8: movsx rax, byte ptr [r8] sub rbp, 8 inc r8 mov [rbp], r8 add r8, rax jmp _next b_call16 = 0x0D bcmd_call16: movsx rax, word ptr [r8] sub rbp, 8 add r8, 2 mov [rbp], r8 add r8, rax jmp _next b_call32 = 0x0E bcmd_call32: movsx rax, dword ptr [r8] sub rbp, 8 add r8, 4 mov [rbp], r8 add r8, rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next b_dup = 0x18 bcmd_dup: push [rsp] jmp _next b_wm = 0x20 bcmd_wm: decq [rsp] jmp _next b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next b_qbranch8 = 0x12 bcmd_qbranch8: pop rax or rax, rax jnz bcmd_branch8 inc r8 jmp _next b_qbranch16 = 0x13 bcmd_qbranch16: pop rax or rax, rax jnz bcmd_branch16 add r8, 2 jmp _next b_bad = 0x00 bcmd_bad: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bad_byte #     mov edx, msg_bad_byte_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 1 #    1 int 0x80 #   b_bye = 0x01 bcmd_bye: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout mov ecx, offset msg_bye #     mov edx, msg_bye_len #   int 0x80 #   mov eax, 1 #   тДЦ 1 тАФ sys_exit mov ebx, 0 #    0 int 0x80 #   b_type = 0x80 bcmd_type: mov eax, 4 #   тДЦ 4 тАФ sys_write mov ebx, 1 #  тДЦ 1 тАФ stdout pop rdx pop rcx push r8 int 0x80 #   pop r8 jmp _next 


рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?


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

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

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

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

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

рдЖрдк рд╢рд╛рд╕реНрддреНрд░реАрдп рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рднрд╛рд╡реЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, A = 5 + (B + C * 4))ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ! :)

рдирд┐рд░рдВрддрд░рддрд╛: рдореВрд▓ рдЕрдореЗрд░рд┐рдХреА рдореЗрдВ рдХрд┐рд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рдорд╢реАрди (рдФрд░ рди рдХреЗрд╡рд▓) (рднрд╛рдЧ 2)

Source: https://habr.com/ru/post/hi431932/


All Articles