9 рджрд┐рд╕рдВрдмрд░ 2014 рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦ2018 рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ: Ren├йRebe рдиреЗ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рдпрд╛ ( рднрд╛рдЧ 2 )рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдореИрдВрдиреЗ
рд▓реБрдбрдо рдбреЗрдпрд░ # 31 рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╕рдореНрдореЗрд▓рди рдХреА рдШреЛрд╖рдгрд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
рд╣реА, рдореЗрд░реЗ
рд╣рд╛рд▓рд┐рдпрд╛ рд╢реМрдХ рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдбреЙрд╕ рдХреЗ рддрд╣рдд рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕реНрдХреВрд▓ рдХрд╛ рдЦреЗрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓рдХреНрд╖реНрдп рдордВрдЪ DOSBox рд╣реИред рдпрд╣ рдбреЙрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕рднреА рдЖрдзреБрдирд┐рдХ x86 рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреБрд░рд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд┐рдЫрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, 16-рдмрд┐рдЯ 8086 рддрдХред
рдореИрдВрдиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдореНрдореЗрд▓рди рдореЗрдВ
рдбреЙрд╕ рдбрд┐рдлреЗрдВрдбрд░ рдЧреЗрдо рдмрдирд╛рдпрд╛ рдФрд░ рджрд┐рдЦрд╛рдпрд╛ред рдХрд╛рд░реНрдпрдХреНрд░рдо 32-рдмрд┐рдЯ 80386 рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп COM-рдлрд╝рд╛рдЗрд▓, рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рдЦреЗрд▓ рдХреЛ 10 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдкрдХреЛ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдпрд╛ рдЧреЗрдордкреИрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рд▓реБрдбреБрдо рдбреЗрдпрд░ рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдорд╛рдЙрд╕ рд╕рдорд░реНрдерди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред
рд╕рдмрд╕реЗ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐
рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдбреЙрд╕ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА ! рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдирд┐рдпрдорд┐рдд рд▓рд┐рдирдХреНрд╕ рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ (рдЬреАрд╕реАрд╕реА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдбреЙрд╕ рдХреЗ рд▓рд┐рдП рдбреЙрд╕ рдбрд┐рдлреЗрдВрдбрд░ рднреА рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред рдореИрдВ DOS рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЬреЛ рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рд░реВрдк рд╣реИ рдЬрд┐рд╕рдореЗрдВ
DOS рдЖрдЬ рднреА рдореМрдЬреВрдж рд╣реИ ред DOSBox рдФрд░ DOSEMU рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░, рдпрд╣ рдЯреВрд▓ рдХрд╛ рдПрдХ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реЗрдЯ рд╣реИред
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ "рдЬреАрд╕реАрд╕реА рдкрд░ рдзреЛрдЦрд╛" рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЬреАрд╕реАрд╕реА рд▓рд┐рдирдХреНрд╕ рдХреЗ рд╕рд╛рде рдбреЙрд╕ рдХреЙрдо рдХрд╛рд░реНрдпрдХреНрд░рдо "рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб" рд▓рд┐рдЦреЗрдВрдЧреЗред
рд╕рд╣реА рдЙрдкрдХрд░рдг рдвреВрдБрдврдирд╛
рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рдЬреАрд╕реАрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдбреЗрдмрд┐рдпрди рдХреЗ рд▓рд┐рдП
рдмреАрд╕реАрд╕реА рдкреИрдХреЗрдЬ (рдмреНрд░реВрд╕ рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░) рдХреА рдЦреЛрдЬ рдХреА, рдЬреЛ 8086 рдХреЗ рд▓рд┐рдП 16-рдмрд┐рдЯ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ x86 рдмреВрдЯ рд▓реЛрдбрд░ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреАрдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЙрд╕ рдХреЙрдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдиреЗ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рджреАред
рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП: рдЗрдВрдЯреЗрд▓ 8086 16-рдмрд┐рдЯ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ 1978 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдХреЛрдИ рд╡рд┐рдЪрд┐рддреНрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рдереАрдВ: рдХреЛрдИ рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛, рдХреЛрдИ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢, рдФрд░ рдХреЗрд╡рд▓ 1 рдПрдордмреА рдкрддрд╛ рдпреЛрдЧреНрдп рд░реИрдоред рд╕рднреА рдЖрдзреБрдирд┐рдХ x86 рдбреЗрд╕реНрдХрдЯреЙрдк рдФрд░ рд▓реИрдкрдЯреЙрдк рдЕрднреА рднреА рдЗрд╕ 16-рдмрд┐рдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ 8086 рдЪрд╛рд▓реАрд╕ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдПрдХ рд╣реА рд╕реАрдорд┐рдд рдкрддреЗ рдФрд░ рд╕рднреА рдХреЗ рд╕рд╛рде рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмрд╣реБрдд рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рд╣реИред рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛
рд╣реИ ред рдпрд╣ рд╡рд╣ рдореЛрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА x86 рдХрдВрдкреНрдпреВрдЯрд░ рдмреВрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЖрдзреБрдирд┐рдХ рдУрдПрд╕ рддреБрд░рдВрдд рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде
рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдбреЙрд╕ рдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, bcc рдПрдХ ANSI C рд╕рдВрдХрд▓рдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ K & R C рдХреЗ рдЙрдкрд╕рдореВрд╣ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдмрд┐рд▓реНрдЯ-рдЗрди x86 рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рднреАред рдЕрдиреНрдп 8086 рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕рдореЗрдВ "рджреВрд░" рдпрд╛ "рд▓рдВрдмреЗ" рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП
рдЕрдиреНрдп рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ (рд╡реАрдЬреАрдП, рдШрдбрд╝рд┐рдпреЛрдВ, рдЖрджрд┐) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдиреЛрдЯ: рдЗрди "рд▓реЙрдиреНрдЧ рдкреЙрдЗрдВрдЯрд░реНрд╕" 8086 рдХреЗ рдЕрд╡рд╢реЗрд╖ рдЕрднреА рднреА Win32 API рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИрдВ:
LPSTR
,
LPWORD
,
LPDWORD
, рдЖрджрд┐ рдЬреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди
LPDWORD
рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рд╕реЗ рдЪрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдмреАрд╕реАрд╕реА рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓рд┐рдВрдЧ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рдореЗрдВ рдЪрд░ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рд╕рдореНрдореЗрд▓рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрди рд╕реАрдорд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
DJGPP
рдбреАрдЬреЗрдЬреАрдкреАрдкреА - рдбреЙрд╕ рдХреЗ рддрд╣рдд рдЬреАрд╕реАрд╕реА рдкреЛрд░реНрдЯред рдПрдХ рдмрд╣реБрдд рд╣реА рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЛ рд▓рдЧрднрдЧ рд╕рдВрдкреВрд░реНрдг POSIX рдХреЛ DOS рдХреЗ рддрд╣рдд рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреА рд╣реИред рдХрдИ рдбреЙрд╕-рдкреЛрд░реНрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбреАрдЬреЗрдЬреАрдкреАрдкреА рдкрд░ рдмрдиреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╣ рдХреЗрд╡рд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдХреЗ рд▓рд┐рдП 32-рдмрд┐рдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ рдЖрдкрдХреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реАрдЬреАрдП) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо
рдбреЙрд╕ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдЗрдВрдЯрд░рдлреЗрд╕ (DPMI) рдХреА рд╕реЗрд╡рд╛ рдХреЗ
рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВрдиреЗ рдбреАрдЬреЗрдЬреАрдкреАрдкреА рд▓рд┐рдпрд╛, рддреЛ рдореИрдВ рдЦреБрдж рдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдмрд╛рдЗрдирд░реА рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд░рдЦ рд╕рдХрддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдбреАрдкреАрдПрдордЖрдИ рд╕рд░реНрд╡рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рджрд░реНрд╢рди DPMI рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рднреА рдЧреНрд░рд╕реНрдд рд╣реИред
рдбреАрдЬреЗрдЬреАрдкреАрдкреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдПрдХ рдЙрдкрдпреЛрдЧреА
рдмрд┐рд▓реНрдб-рдбреАрдЬрдЧрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╕рдм рдХреБрдЫ рдЪрд▓рд╛рддрд╛ рд╣реИред
рдпрд╛ рддреЛ рдПрдХ рдЧрдВрднреАрд░ рдЧрд▓рддреА рдереА, рдпрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреАрдЬреЗрдЬреАрдкреАрдкреА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝
рдлрд┐рд░ рд╕реЗ рд╡рд╛рдпрд░рд╕ рд╕реЗ рд╕рдВрдХреНрд░рдорд┐рдд рдереЗ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдбреЙрд╕рдмреЙрдХреНрд╕ рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд┐рдП, рддреЛ рддреНрд░реБрдЯрд┐ "рд╡рд╛рдпрд░рд╕ рдирд╣реАрдВ: рд╡рд╛рдпрд░рд╕ рдХреА рдЬрд╛рдВрдЪ" рд▓рдЧрд╛рддрд╛рд░ рджрд┐рдЦрд╛рдИ рджреАред рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд╛рдпрд░рд╕ рдореЗрд░реА рдорд╢реАрди рдкрд░ рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдкрд░ рдбреАрдЬреЗрдЬреАрдкреАрдкреА рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдПрдХ рд╕рд╛рдл рдХрдорд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ ARM- рдЖрдзрд╛рд░рд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ x86 рд╡рд╛рдпрд░рд╕ рд╕реЗ рд╕рдВрдХреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ, рдФрд░ рд╕рднреА рдмрд╛рдЗрдирд░реА рд╣реИрд╢ рдорд╢реАрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рди рдереЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред
рддреЛ рдпрд╣ рдФрд░ DPMI рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЖрдЧреЗ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред
рдлреБрд▓рд┐рдВрдЧ рдЬреАрд╕реАрд╕реА
рдореИрдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЬрд┐рд╕ рдкрд░ рдмрд╕ рдЧрдпрд╛ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдбреЙрд╕ рдХреЙрдо рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП "рдзреЛрдЦрд╛" рдЬреАрд╕реАрд╕реА рдХреА рдореБрд╢реНрдХрд┐рд▓ рдЪрд╛рд▓ рдереАред рдпрд╣ рдЯреНрд░рд┐рдХ 80386 рддрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ (рдЬреЛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП рд╣реЛрддреА рд╣реИ)ред 80386 рдкреНрд░реЛрд╕реЗрд╕рд░ 1985 рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдкрд╣рд▓рд╛ 32-рдмрд┐рдЯ x86 рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдмрди рдЧрдпрд╛ред рдЬреАрд╕реАрд╕реА рдЕрднреА рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ x86-64 рд╡рд╛рддрд╛рд╡рд░рдг рдкрд░ рднреАред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬреАрд╕реАрд╕реА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ 16-рдмрд┐рдЯ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ 8086 рдХреЗ рд▓рд┐рдП рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рдореВрд▓ рд▓рдХреНрд╖реНрдп рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд▓рдХреНрд╖реНрдп DOSBox рдордВрдЪ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ 80386 рдПрдореБрд▓реЗрдЯрд░ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЯреНрд░рд┐рдХ рдХреЛ рдорд┐рдирдЧрд╡ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдПрдХ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИ ("рдЧреИрд░ рдкреАрдИ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдкреАрдИ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА")ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд┐рдпрд╛ рдерд╛: рдЖрдкрдХреЛ
OUTPUT_FORMAT
рдирд┐рд░реНрджреЗрд╢ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд
objcopy
рдЪрд░рдг (
objcopy -O binary
) рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирдорд╕реНрддреЗ рд╡рд┐рд╢реНрд╡ рдбреЙрд╕ рдкрд░
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЬреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЙрд╕ рдХреЙрдо рдХрд╛рд░реНрдпрдХреНрд░рдо "рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб" рдмрдирд╛рдПрдВрдЧреЗред
рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдзрд╛ рд╣реИ:
рдХреЛрдИ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред рдпрд╣ рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдХреБрдЫ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЬреЛ рдбреЙрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдИ
printf()
рдпрд╛ рдкрд╕рдВрдж рдирд╣реАрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрд╕ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВред DOS рдЕрдиреБрд░реЛрдз рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЗрдирд▓рд╛рдЗрди рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб!
рдбреЙрд╕ рдХреЗ рдиреМ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВ: 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2Fред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд░реБрдЪрд┐ 0x21 рд╣реИ, рдлрд╝рдВрдХреНрд╢рди 0x09 (рдПрдХ рд▓рд╛рдЗрди рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ)ред рдбреЙрд╕ рдФрд░ BIOS рдХреЗ рдмреАрдЪ,
рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдирд╛рдо рдкрд░ рд╣рдЬрд╛рд░реЛрдВ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ ред рдореИрдВ x86 рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдЦреНрдпрд╛
ah
рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдлрдВрд╕ рдЬрд╛рддреА рд╣реИ - рдФрд░ 0x21 рдЗрдВрдЯрд░рдкреНрдЯ рдлрд╛рдпрд░ред рдлрдВрдХреНрд╢рди 0x09 рдПрдХ рддрд░реНрдХ рднреА рд▓реЗрддрд╛ рд╣реИ - рдкреНрд░рд┐рдВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░, рдЬреЛ
dx
рдФрд░
ds
рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ GCC рдЗрдирд▓рд╛рдЗрди рдЕрд╕реЗрдВрдмрд▓рд░ рдХрд╛
print()
рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреА рдЧрдИ рд▓рд╛рдЗрдиреЗрдВ $ рд╡рд░реНрдг рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдбреА.рдУ.рдПрд╕.
static void print(char *string) { asm volatile ("mov $0x09, %%ah\n" "int $0x21\n" : : "d"(string) : "ah"); }
рдХреЛрдб рдХреЛ
volatile
рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ (рд▓рд╛рдЗрди рдкреНрд░рд┐рдВрдЯ) рд╣реЛрддрд╛ рд╣реИред рдЬреАрд╕реАрд╕реА рдХреЗ рд▓рд┐рдП, рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИ, рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдЖрдЙрдЯрдкреБрдЯ / рдЗрдирдкреБрдЯ / рдХреНрд▓реЙрдмрд░ рдкреНрд░рддрд┐рдмрдВрдз (рдЕрдВрддрд┐рдо рддреАрди рд▓рд╛рдЗрдиреЗрдВ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдбреЙрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрдХ рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛрдВрдЧреЗред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдбреЙрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ - рд╕рд░рд▓ рд╕реА рдХреЗ рд▓рд┐рдП рджреБрд░реНрдЧрдо рдЪреАрдЬреЗрдВред
рдЖрдкрдХреЛ рдХреЙрд▓рд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЬреАрд╕реАрд╕реА рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐
string
рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рдореЗрдореЛрд░реА рдХрднреА рдкрдврд╝реА рдЧрдИ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕рд░рдгреА рдХреЛ рднреА
volatile
рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕рдм рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ: рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреЛрдИ рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдВрддрд╣реАрди рд╕рдВрдШрд░реНрд╖ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдЗрди рд╕рднреА рд▓рдбрд╝рд╛рдИрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬреАрддрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдореБрдЦреНрдп рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдПред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдирд╛рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ
main()
рдХрд╣рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реВрдВ
main()
, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд┐рдирдЬреАрдбрдмреНрд▓реНрдпреВ рдХреЗ рдкрд╛рд╕ рдордЬреЗрджрд╛рд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рдЙрд╕рд╕реЗ рдирд╣реАрдВ рдкреВрдЫреЗрдВред
int dosmain(void) { print("Hello, World!\n$"); return 0; }
COM рдлрд╛рдЗрд▓реЗрдВ рдЖрдХрд╛рд░ рдореЗрдВ 65279 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ x86 рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ 64 KB рд╣реИ, рдФрд░ DOS рдХреЗрд╡рд▓ COM рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ 0x0100 рд╕реЗрдЧрдореЗрдВрдЯ рдкрддреЗ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рд╢реАрд░реНрд╖рд╛рд╕рди рдирд╣реАрдВ, рдмрд╕ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдмрд╛рдЗрдирд░реАред рдЪреВрдВрдХрд┐ COM рдкреНрд░реЛрдЧреНрд░рд╛рдо, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрдЖрдЙрдЯ (рдлреНрд░реАрд╕реНрдЯреИрдВрдбрд┐рдВрдЧ) рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреВрд░реА рдЪреАрдЬ рдХреЛ рдПрдХрд▓ рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдПрдХ рдЬреАрд╕реАрд╕реА рдХреЙрд▓ рд╣реЛрдЧрд╛ред
рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдк
рдпрд╣рд╛рдБ рдореБрдЦреНрдп рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
-std=gnu99 -Os -nostdlib -m32 -march=i386 -ffreestanding
рдЪреВрдВрдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП gnu99 рдФрд░ c99 рдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдЯреНрд░рд┐рдЧреНрд░рд╛рдл (рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рд╣реИ, рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ
__asm__
рдмрдЬрд╛рдп
asm
рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдиреНрдпреВрдЯрди рдХрд╛ рдмрд┐рди рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреАрд╕реАрд╕реА рд╕реЗ рдЗрддрдиреА рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧреА рдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдЬреАрд╕реАрд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИред
-Os
рд╡рд┐рдХрд▓реНрдк рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рдВрдХрд▓рди рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рдбреЙрд╕рдмреЙрдХреНрд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдореБрд▓реЗрдЯрд░ 80 рдХреЗ рджрд╢рдХ рдХреА рдорд╢реАрди рдХреА рддрд░рд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдЪрд▓рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рд╕реАрдорд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрджрд┐ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ
-O0
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреА рддреНрд░реБрдЯрд┐ рдпрд╛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдпрд╣рд╛рдБ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рдкрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрдмрдВрдзрд┐рдд рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдорд╛рдиреНрдп рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣ рдЬреАрд╕реАрд╕реА рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЦреБрдж рдпрд╣рд╛рдВ рдкрд╛рдЧрд▓ рдЪреАрдЬреЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢рд╛рд╡рд╛рджреА рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрднреА-рдХрднреА рдХрдЪрд░реЗ рд╕реЗ рднрд░реЗ рд╣реЛрддреЗ рдереЗред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЦрддрд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреАрд╕реАрд╕реА рдХрд╛ рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рднреА рд╕реНрдорд╛рд░реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдЖрдкрдХрд╛ рдорд┐рддреНрд░
volatile
ред
рдЕрдЧрд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░
-nostdlib
, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рднреАред
Parameters
-m32-march=i386
рд╕рдВрдХрд▓рдХ рдХреЛ 80386 рдХреЛрдб рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛
-m32-march=i386
рдЕрдЧрд░ рдореИрдВрдиреЗ рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд▓рд┐рдП рдмреВрдЯрд▓реЛрдбрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ 80686 рдкрд░ рджреГрд╖реНрдЯрд┐ рднреА рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди DOSBox 80386 рд╣реИред
-ffreestanding
рддрд░реНрдХ рдХреЗ рд▓рд┐рдП GCC рдХреЛ рдХреЛрдб рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИред рдХрднреА-рдХрднреА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рдеред рдореБрдЭреЗ bcc рдХреЗ рд╕рд╛рде рдПрдХ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдереА, рдЬрд╣рд╛рдБ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдХреНрд╖рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред рдмреВрдЯ рд▓реЛрдбрд░ рдФрд░ OS рдХрд░реНрдиреЗрд▓ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдм рдбреЙрд╕ .com рдлрд╛рдЗрд▓реЗрдВред
рд▓рд┐рдВрдХрд░ рд╡рд┐рдХрд▓реНрдк
-Wl
рдЙрдкрдпреЛрдЧ рд▓рд┐рдВрдХрд░ (
ld
) рдореЗрдВ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬреАрд╕реАрд╕реА рдореЗрдВ рдПрдХ рдХреЙрд▓ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВред
-Wl,--nmagic,--script=com.ld
--nmagic
рдЕрдиреБрднрд╛рдЧ рдкреГрд╖реНрда рд╕рдВрд░реЗрдЦрдг рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ, рдпрд╣ рдХреАрдорддреА рдЬрдЧрд╣ рдмрд░реНрдмрд╛рдж рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╛рдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред
--script
рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖
рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕реЗрдХреНрд╢рди (
text
,
data
,
bss
,
rodata
) рдХреЛ рд╕рд╣реА рдЬрдЧрд╣ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ
com.ld
ред
com.ld
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред
OUTPUT_FORMAT(binary) SECTIONS { . = 0x0100; .text : { *(.text); } .data : { *(.data); *(.bss); *(.rodata); } _heap = ALIGN(4); }
OUTPUT_FORMAT(binary)
рдЖрдкрдХреЛ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ (рдпрд╛ рдкреАрдИ, рдЖрджрд┐) рдореЗрдВ рдЗрд╕реЗ рдирд╣реАрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рд▓рд┐рдВрдХрд░ рдХреЛ рдХреЗрд╡рд▓ рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ COM рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдл рдХреНрд▓реАрди рдХреЛрдб рд╣реИ, рдпрд╛рдиреА рд╣рдо рд▓рд┐рдВрдХрд░ рдХреЛ COM рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рджреЗрддреЗ рд╣реИрдВ!
рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ COM рдлрд╛рдЗрд▓реЗрдВ
0x0100
рдЕрдкрд▓реЛрдб рдХреА
0x0100
ред рдЪреМрдереА рдкрдВрдХреНрддрд┐ рдмрд╛рдЗрдирд░реА рдХреЛ рд╡рд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреА рд╣реИред COM рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рдЕрднреА рднреА рдХреЛрдб рдХрд╛ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдореЗрдореЛрд░реА рдСрдлрд╝рд╕реЗрдЯ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдлрд┐рд░ рд╕рднреА рдЕрдиреБрднрд╛рдЧ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ:
text
(рдХрд╛рд░реНрдпрдХреНрд░рдо),
data
(рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛),
bss
(рд╢реВрдиреНрдп рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛),
rodata
(рддрд╛рд░)ред рдЕрдВрдд рдореЗрдВ, рдореИрдВ
_heap
рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдирд░реА рдХреЗ рдЕрдВрдд рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛ рдЬрдм
sbrk()
рдЬрдм рд╣рдо тАЬHello, WorldтАЭ рдХреЗ рд╕рд╛рде рд╣реЛрдВрдЧреЗред рдореИрдВрдиреЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде
_heap
рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред
рд▓рдЧрднрдЧ рдХрд┐рдпрд╛ рд╣реБрдЖред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╢реБрднрд╛рд░рдВрдн
рд▓рд┐рдВрдХрд░ рдЖрдорддреМрд░ рдкрд░ рд╣рдорд╛рд░реЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ (
main
) рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдордиреЗ "рдмрд╛рдЗрдирд░реА" рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐
print()
рдлрд╝рдВрдХреНрд╢рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрд╕реА рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛, рдЬреЛ рдЧрд▓рдд рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рд╢реАрд░реНрд╖рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ
STARTUP
рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕реАрдзреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ
crt0.o
рдпрд╛
Boot.o
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрди рдкрд░ рдХрд╣реАрдВ рдареЛрдХрд░ рдЦрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдХреЛрдб
рдХреЛ рдЗрд╕ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП , рдХрд┐рд╕реА рднреА рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рдкрд╕рдВрдж рд╕реЗ рдкрд╣рд▓реЗред рдбреЙрд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХрд░реЗрдЧрд╛, рд╣рдореЗрдВ рдмрд╕ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
asm (".code16gcc\n" "call dosmain\n" "mov $0x4C, %ah\n" "int $0x21\n");
.code16gcc
рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдпрд╣ рд╕рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд░ рд╕рдХреЗред рдирд╛рдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ 16-рдмрд┐рдЯ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди
рдирд╣реАрдВ рдХрд░реЗрдЧрд╛! рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
dosmain
рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рдлрд┐рд░ 0x4C рдлрд╝рдВрдХреНрд╢рди ("рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЙрд╕ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо 1-рдмрд╛рдЗрдЯ
al
рд░рдЬрд┐рд╕реНрдЯрд░ (рдкрд╣рд▓реЗ рд╕реЗ
dosmain
рджреНрд╡рд╛рд░рд╛
dosmain
) рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ
volatile
рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рд╣реИред
рд╕рдм рдПрдХ рд╕рд╛рде
рдпрд╣рд╛рдБ C рдореЗрдВ рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред
asm (".code16gcc\n" "call dosmain\n" "mov $0x4C,%ah\n" "int $0x21\n"); static void print(char *string) { asm volatile ("mov $0x09, %%ah\n" "int $0x21\n" : : "d"(string) : "ah"); } int dosmain(void) { print("Hello, World!\n$"); return 0; }
рдореИрдВ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ред
com.ld
рдпрд╣рд╛рдВ рдЬреАрд╕реАрд╕реА рдЪреБрдиреМрддреА рд╣реИред
gcc -std=gnu99 -Os -nostdlib -m32 -march=i386 -ffreestanding \ -o hello.com -Wl,--nmagic,--script=com.ld hello.c
рдФрд░ DOSBox рдореЗрдВ рдЙрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг:

рдлрд┐рд░ рдпрджрд┐ рдЖрдк рд╕реБрдВрджрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рд░реБрдХрд╛рд╡рдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░
рд╡реАрдЬреАрдП рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк рдзреНрд╡рдирд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреАрд╕реА рд╕реНрдкреАрдХрд░ рдЗрдВрдЯрд░рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рд╛рдЙрдВрдб рдмреНрд▓рд╛рд╕реНрдЯрд░ рдХреЛ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЙрд╕ рдкрд▓ рд╕реЗ, рдбреЙрд╕ рдбрд┐рдлреЗрдВрдбрд░ рдмрдбрд╝рд╛ рд╣реБрдЖред
рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди
рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╖рдп рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐
_heap
? рд╣рдо рдЗрд╕реЗ
sbrk()
рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рд╣реИ рдФрд░ рдХреЛрдИ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрд┐рд╕реА рднреА рдореЗрдореЛрд░реА рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдордп рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдХреНрд╖реЗрддреНрд░ рдЙрдкрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдЪрд▓реА рдФрд░ рдКрдкрд░реА рдореЗрдореЛрд░реА)ред рдЗрд╕рд▓рд┐рдП sbrk () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
X86 рдкрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХрдо рдореЗрдореЛрд░реА (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 0x0100) рдореЗрдВ рд╣реИ, рдФрд░ рд╕реНрдЯреИрдХ рдКрдкрд░реА рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 0xffff рдХреНрд╖реЗрддреНрд░ рдореЗрдВ)ред рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░,
sbrk()
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рдореЗрдореЛрд░реА рджреЛ рд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рдЖрддреА рд╣реИ:
sbrk()
рдФрд░
mmap()
ред рдХреНрдпрд╛
sbrk()
рдкреНрд░реЛрдЧреНрд░рд╛рдо / рдбреЗрдЯрд╛ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдареАрдХ рдКрдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдЯреИрдХ рдХреА рдУрд░ "рдЕрдк" рдмрдврд╝рд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓
sbrk()
рдЗрд╕ рд╕реНрдерд╛рди рдХреЛ рдмрдврд╝рд╛рдПрдЧрд╛ (рдпрд╛ рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рдЫреЛрдбрд╝ рджреЗрдЧрд╛)ред рдпрд╣ рдореЗрдореЛрд░реА
malloc()
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред
COM рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ
sbrk()
рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛
sbrk()
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ
size_t
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИред
typedef unsigned short size_t; extern char _heap; static char *hbreak = &_heap; static void *sbrk(size_t size) { char *ptr = hbreak; hbreak += size; return ptr; }
рдпрд╣ рдмрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ
_heap
рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЗрд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдереЛрдбрд╝рд╛ рдЪрд╛рд▓рд╛рдХ
sbrk()
рднреА рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред
рдбреЙрд╕ рдбрд┐рдлреЗрдВрдбрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рд╣реБрдИред рдореИрдВрдиреЗ (рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ) рдорд╛рдирд╛ рдХрд┐ рдореЗрд░реЗ
sbrk()
рд╕реЗ рдореЗрдореЛрд░реА рд░реАрд╕реЗрдЯ рд╣реЛ рдЧрдИ рдереАред рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рдЧреЗрдо рдХреЗ рдмрд╛рдж рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, DOS рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмреАрдЪ рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ
рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬрд╛рд░реА рд░рд╣рд╛ ,
рдЬрд╣рд╛рдВ рдореИрдВ рд░реБрдХрд╛ рдерд╛ , рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЬрдЧрд╣ рдореЗрдВ рднрд░реА рд╣реБрдИ рдереАрдВред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рдВрдпреЛрдЧ! рдпрд╣ рдЗрд╕ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ рдордЬрд╝реЗрджрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред