
рддреЛ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рд╣реА рд╣реИред рд╣рдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд, 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
рдФрд░ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ:
