NASM рдФрд░ QEMU рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди

рдЫрд╡рд┐


рддреЛ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рд╣реА рд╣реИред рд╣рдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд, NASM рдкрд░ рдФрд░ QEMU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗрдВрдЧреЗред рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЪрд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред


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


рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд


рдХрдВрдкреНрдпреВрдЯрд░ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдЪреАрдЬ BIOS рдХреЛрдб (рдпрд╛ UEFI рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ BIOS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛), рдЬреЛ рдХрд┐ рдорджрд░рдмреЛрд░реНрдб рдХреА рдореЗрдореЛрд░реА рдореЗрдВ "рд╡рд╛рдпрд░реНрдб" рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, 0xFFFFFF0 рдкрд░)ред


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


рдЕрдЧрд▓рд╛ рдХрджрдо рдмреВрдЯ рдбрд┐рд╕реНрдХ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдУрдПрд╕ рдмреВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдмреВрдЯ рдбрд┐рд╕реНрдХ рдПрдХ рдбрд┐рд╕реНрдХ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреНрд░рд╛рдЗрд╡) рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗрдХреНрдЯрд░ рдХреЗ рдЕрдВрддрд┐рдо 2 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ (рдкрд╣рд▓рд╛ рд╕реЗрдХреНрдЯрд░ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рдкрд╣рд▓реЗ 512 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 1 рд╕реЗрдХреНрдЯрд░ = 512 рдмрд╛рдЗрдЯреНрд╕) 55 рдФрд░ рдПрдП (рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ) рд╣реИред рдЬреИрд╕реЗ рд╣реА рдПрдХ рдмреВрдЯ рдбрд┐рд╕реНрдХ рдорд┐рд▓рддреА рд╣реИ, BIOS 0x7c00 рдХреЗ рдкрддреЗ рдкрд░ рд░реИрдо рдореЗрдВ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ 512 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рдкрддреЗ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХрдВрдЯреНрд░реЛрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдЧрд╛ред


рдмреЗрд╢рдХ, рдЗрди 512 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдпрд╣ рдПрдХ рдкреВрд░реНрдг рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рд▓реЛрдбрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЦреНрдп рдУрдПрд╕ рдХреЛрдб рдХреЛ рд░реИрдо рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


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


рдЫрд╡рд┐


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


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


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рд░реБрдХрд╛рд╡рдЯ рдХрд╛ рдЕрдкрдирд╛ рдЙрдкрд╕рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╛рда рдкреНрд░рд╛рд░реВрдк (!) рдореЗрдВ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ AH рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдорд╛рди 0x0e рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдВрдЯрд░рдкреНрдЯреНрд╕ рдХреЗ рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред 0x10 рдЖрд╣ рд╕реЗ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ (рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдмрдлрдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдЕрд▓ (рдореБрджреНрд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╡рд░реНрдг)ред рдЗрд╕ рддрд░рд╣ рд╕реЗ


mov ah, 0x0e mov al, 'x' int 0x10 

рдЪрд░рд┐рддреНрд░ 'x' рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред 0x16 рдЖрд╣ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдмрдлрд╝рдВрдХреНрд╢рди) рд╕реЗ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рджрд░реНрдЬ рдХреБрдВрдЬреА рдХрд╛ рдорд╛рди рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд▓ рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рд╣рдо 0x0 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ


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


str_compare.asm:


 compare_strs_si_bx: push si ;         push bx push ax comp: mov ah, [bx] ;     , cmp [si], ah ;      ah jne not_equal ;    ,     cmp byte [si], 0 ;    ,    je first_zero ;    inc si ;     bx  si inc bx jmp comp ;   first_zero: cmp byte [bx], 0 ;    bx != 0,  ,   jne not_equal ;  ,    not_equal mov cx, 1 ;     ,  cx = 1 pop si ;     pop bx pop ax ret ;     not_equal: mov cx, 0 ;  ,  cx = 0 pop si ;    pop bx pop ax ret ;     

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


рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ AX, BX, CX рдФрд░ DX рдХреЛ рджреЛ рдПрдХрд▓-рдмрд╛рдЗрдЯ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: AH, BH, CH рдФрд░ DH рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП, рдФрд░ AL, BL, CL рдФрд░ DL рдХрдо рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдПред


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ bx рдФрд░ si рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ (!) рд╣реИ (рдЬреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдбреНрд░реЗрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ) рдореЗрдореЛрд░реА рдореЗрдВ рдХреБрдЫ рдПрдбреНрд░реЗрд╕ рдкрд░ рдЬрд┐рд╕рдореЗрдВ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реНрдерд┐рдд рд╣реИред рдСрдкрд░реЗрд╢рди [рдмреАрдПрдХреНрд╕] рдмреАрдПрдХреНрд╕ рд╕реЗ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реЗрдЧрд╛, рдпрд╣ рдЗрд╕ рдкрддреЗ рдкрд░ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдХреБрдЫ рдореВрд▓реНрдп рд▓реЗрдЧрд╛ред inc bx рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдм рд╕реВрдЪрдХ рдореВрд▓ рдкрддреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдкрддреЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ред


print_string.asm:


 print_string_si: push ax ;  ax   mov ah, 0x0e ;  ah  0x0e,    call print_next_char ;  pop ax ;  ax ret ;   print_next_char: mov al, [si] ;    cmp al, 0 ;  si  jz if_zero ;     int 0x10 ;     al inc si ;    jmp print_next_char ;   ... if_zero: ret 

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


рдЕрдм рдореБрдЦреНрдп рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рд╣реЛрдЧрд╛):


 ; 0x0d -   , 0xa -    wrong_command: db "Wrong command!", 0x0d, 0xa, 0 greetings: db "The OS is on. Type 'help' for commands", 0x0d, 0xa, 0xa, 0 help_desc: db "Here's nothing to show yet. But soon...", 0x0d, 0xa, 0 goodbye: db 0x0d, 0xa, "Goodbye!", 0x0d, 0xa, 0 prompt: db ">", 0 new_line: db 0x0d, 0xa, 0 help_command: db "help", 0 input: times 64 db 0 ;   - 64  times 510 - ($-$$) db 0 dw 0xaa55 

рдХреИрд░рд┐рдЬ рд░рд┐рдЯрд░реНрди рдХреИрд░реЗрдХреНрдЯрд░ рдХреИрд░рд┐рдЬ рдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВред


 input: times 64 db 0 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдХреЗ рдиреАрдЪреЗ 64 рдмрд╛рдЗрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╢реВрдиреНрдп рд╕реЗ рднрд░рддреЗ рд╣реИрдВред


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


 times 510 - ($-$$) db 0 dw 0xaa55 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ (рдПрдХреНрд╕рдЯреЗрдВрд╢рди .bin рдХреЗ рд╕рд╛рде) 512 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдкрд╣рд▓реЗ 510 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЬрд╝реАрд░реЛрд╕ рдХреЗ рд╕рд╛рде рднрд░реЗрдВ (рдмреЗрд╢рдХ, рд╡реЗ рдкреВрд░реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднрд░реЗ рд╣реБрдП рд╣реИрдВ), рдФрд░ рдЖрдЦрд┐рд░реА рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рд╣реА "рдореИрдЬрд┐рдХ" рдмрд╛рдЗрдЯреНрд╕ 55 рдФрд░ рдПрдП рдХреЗ рд╕рд╛рдеред ред $ рдХрд╛ рдорддрд▓рдм рд╡рд░реНрддрдорд╛рди рдЕрдиреБрджреЗрд╢ рдХрд╛ рдкрддрд╛ рд╣реИ, рдФрд░ $ $ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛ рд╣реИред


рдЪрд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:


 org 0x7c00 ; (1) bits 16 ; (2) jmp start ;    start %include "print_string.asm" ;     %include "str_compare.asm" ; ==================================================== start: mov ah, 0x00 ;   (3) mov al, 0x03 int 0x10 mov sp, 0x7c00 ;   (4) mov si, greetings ;    call print_string_si ;      mainloop 

(1)ред рдпрд╣ рдХрдорд╛рдВрдб NASM рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЛрдб рдХреЛ 0x7c00 рд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдкрддреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рднреА рдкрддреЛрдВ рдХреЛ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рди рдХрд░реЗрдВред
(2)ред рдпрд╣ рдХрдорд╛рдВрдб NASM рдХреЛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╣рдо 16-рдмрд┐рдЯ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред
(3)ред рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╕рдордп, QEMU рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд╣ 0x00 рдкрд░, 0x03 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ 0x10 рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдХреНрд░реАрди рд╕рд╛рдлрд╝ рд╣реЛ рд╕рдХреЗред
(4)ред рд╕реНрдЯреИрдХ рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрд╕рдкреА рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рд╢реАрд░реНрд╖ рдХрд┐рд╕ рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред рдПрд╕рдкреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдЧрд▓рд╛ рдореВрд▓реНрдп рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реНрдЯреИрдХ рдореЗрдВ рдорд╛рди рдЬреЛрдбрд╝реЗрдВ - рдПрд╕рдкреА 2 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдореЗрдореЛрд░реА рдХреЛ рдиреАрдЪреЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд░рд┐рдпрд▓ рдореЛрдб рдореЗрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕рднреА рд░рдЬрд┐рд╕реНрдЯрд░ рдСрдкрд░реЗрдВрдб 16-рдмрд┐рдЯ, рдпрд╛рдиреА рдбрдмрд▓-рдмрд╛рдЗрдЯ, рдорд╛рди) рд╣реИрдВред рд╣рдордиреЗ 0x7c00 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдЯреИрдХ рдкрд░ рдорд╛рдиреЛрдВ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рдареАрдХ рдмрдЧрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ - рдвреЗрд░ рдиреАрдЪреЗ (!) рдмрдврд╝рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рд╣реИрдВ, рдПрд╕рдкреА рд╕реНрдЯреИрдХ рдХрд╛ рд╕реВрдЪрдХ рдЙрддрдиреА рд╣реА рдХрдо рдореЗрдореЛрд░реА рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред


 mainloop: mov si, prompt ;   call print_string_si call get_input ;     jmp mainloop ;  mainloop... 

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


 get_input: mov bx, 0 ;  bx      input_processing: mov ah, 0x0 ;    0x16 int 0x16 ;  ASCII  cmp al, 0x0d ;   enter je check_the_input ;   ,   ,  ;    cmp al, 0x8 ;   backspace je backspace_pressed cmp al, 0x3 ;   ctrl+c je stop_cpu mov ah, 0x0e ;     -   ;     int 0x10 mov [input+bx], al ;       inc bx ;   cmp bx, 64 ;  input  je check_the_input ;    ,    enter jmp input_processing ;    

(1) [рдЗрдирдкреБрдЯ + рдмреАрдПрдХреНрд╕] рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЗрдирдкреБрдЯ рдмрдлрд░ рдЗрдирдкреБрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдмреАрдПрдХреНрд╕ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдо рдмрдлрд░ рдХреЗ 1 рддрддреНрд╡ рдХреЛ bx + рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред


 stop_cpu: mov si, goodbye ;   call print_string_si jmp $ ;    ; $     

рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдЕрдЧрд░ рдЖрдкрдиреЗ Ctrl + C рджрдмрд╛рдпрд╛ рд╣реИ, рддреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗрд╡рд▓ jmp $ рдлрдВрдХреНрд╢рди рдХрд░рддрд╛ рд╣реИред


 backspace_pressed: cmp bx, 0 ;  backspace ,  input ,  je input_processing ;    mov ah, 0x0e ;  backspace.  ,   int 0x10 ;   ,      mov al, ' ' ;      ,  int 0x10 ;   mov al, 0x8 ;       int 0x10 ;     backspace dec bx mov byte [input+bx], 0 ;    input   jmp input_processing ;    

рдмреИрдХрд╕реНрдкреЗрд╕ рджрдмрд╛рддреЗ рд╕рдордп '>' рд╡рд░реНрдг рдХреЛ рди рдорд┐рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдирдкреБрдЯ рдЦрд╛рд▓реА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреБрдЫ рднреА рди рдХрд░реЗрдВред


 check_the_input: inc bx mov byte [input+bx], 0 ;     ,   ;  (  '\0'  ) mov si, new_line ;     call print_string_si mov si, help_command ;  si     help mov bx, input ;   bx -   call compare_strs_si_bx ;  si  bx (  help) cmp cx, 1 ; compare_strs_si_bx   cx 1,  ;     je equal_help ;  =>    ;  help jmp equal_to_nothing ;   ,   "Wrong command!" 

рдпрд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред


 equal_help: mov si, help_desc call print_string_si jmp done equal_to_nothing: mov si, wrong_command call print_string_si jmp done 

рдЬреЛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╛ рддреЛ help_desc рдЪрд░ рдХрд╛ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЧрд▓рдд_ рдкрд╛рда рдЪрд░ рдХрд╛ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред


 ; done    input done: cmp bx, 0 ;     input   je exit ;   ,    mainloop dec bx ;  ,      mov byte [input+bx], 0 jmp done ;       exit: ret 

рджрд░рдЕрд╕рд▓, рдкреВрд░рд╛ рдХреЛрдб рд╣реИ:


prompt.asm:


 org 0x7c00 bits 16 jmp start ;    start %include "print_string.asm" %include "str_compare.asm" ; ==================================================== start: cli ;  ,    ;     mov ah, 0x00 ;   mov al, 0x03 int 0x10 mov sp, 0x7c00 ;   mov si, greetings ;    call print_string_si ;      mainloop mainloop: mov si, prompt ;   call print_string_si call get_input ;     jmp mainloop ;  mainloop... get_input: mov bx, 0 ;  bx      input_processing: mov ah, 0x0 ;    0x16 int 0x16 ;  ASCII  cmp al, 0x0d ;   enter je check_the_input ;   ,   ,  ;    cmp al, 0x8 ;   backspace je backspace_pressed cmp al, 0x3 ;   ctrl+c je stop_cpu mov ah, 0x0e ;     -   ;     int 0x10 mov [input+bx], al ;       inc bx ;   cmp bx, 64 ;  input  je check_the_input ;    ,    enter jmp input_processing ;    stop_cpu: mov si, goodbye ;   call print_string_si jmp $ ;    ; $     backspace_pressed: cmp bx, 0 ;  backspace ,  input ,  je input_processing ;    mov ah, 0x0e ;  backspace.  ,   int 0x10 ;   ,      mov al, ' ' ;      ,  int 0x10 ;   mov al, 0x8 ;       int 0x10 ;     backspace dec bx mov byte [input+bx], 0 ;    input   jmp input_processing ;    check_the_input: inc bx mov byte [input+bx], 0 ;     ,   ;  (  '\0'  ) mov si, new_line ;     call print_string_si mov si, help_command ;  si     help mov bx, input ;   bx -   call compare_strs_si_bx ;  si  bx (  help) cmp cx, 1 ; compare_strs_si_bx   cx 1,  ;     je equal_help ;  =>    ;  help jmp equal_to_nothing ;   ,   "Wrong command!" equal_help: mov si, help_desc call print_string_si jmp done equal_to_nothing: mov si, wrong_command call print_string_si jmp done ; done    input done: cmp bx, 0 ;     input   je exit ;   ,    mainloop dec bx ;  ,      mov byte [input+bx], 0 jmp done ;       exit: ret ; 0x0d -   , 0xa -    wrong_command: db "Wrong command!", 0x0d, 0xa, 0 greetings: db "The OS is on. Type 'help' for commands", 0x0d, 0xa, 0xa, 0 help_desc: db "Here's nothing to show yet. But soon...", 0x0d, 0xa, 0 goodbye: db 0x0d, 0xa, "Goodbye!", 0x0d, 0xa, 0 prompt: db ">", 0 new_line: db 0x0d, 0xa, 0 help_command: db "help", 0 input: times 64 db 0 ;   - 64  times 510 - ($-$$) db 0 dw 0xaa55 

рдпрд╣ рд╕рдм рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░реЗрдВ:


 nasm -f bin prompt.asm -o bootloader.bin 

рдФрд░ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдирд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде QEMU рдПрдореБрд▓реЗрдЯрд░ рдЪрд▓рд╛рдПрдВ (-monitor stdio рдЖрдкрдХреЛ рдкреНрд░рд┐рдВрдЯ $ reg рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдордп рд░рдЬрд┐рд╕реНрдЯрд░ рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ):


 qemu-system-i386 bootloader.bin -monitor stdio 

рдФрд░ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ:


рдЫрд╡рд┐

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


All Articles