рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (VM) рд▓рд┐рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдБ рдЬреЛ
2048 (рдореЗрд░реЗ рдорд┐рддреНрд░) рдпрд╛
рд░реЛрдЬреБрдПрд▓рд┐рдХ (рдореЗрд░рд╛) рдЬреИрд╕реЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИред рдЕрдкрдиреА рдЦреБрдж рдХреА рдЖрднрд╛рд╕реА рдорд╢реАрди рд▓рд┐рдЦрдирд╛ рдереЛрдбрд╝рд╛ рдбрд░рд╛рд╡рдирд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╖рдп рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдФрд░ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рд╣реИред
рдЕрдВрддрд┐рдо рдХреЛрдб рд╕реА рдореЗрдВ рд▓рдЧрднрдЧ 250 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рд╕реА рдпрд╛ рд╕реА ++ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐
рдмрд╛рдЗрдирд░реА рдЕрдВрдХрдЧрдгрд┐рдд ред рдХреЛрдИ рднреА рдпреВрдирд┐рдХреНрд╕ рдкреНрд░рдгрд╛рд▓реА (macOS рд╕рд╣рд┐рдд) рднрд╡рди рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдХрдВрд╕реЛрд▓ рдЗрдирдкреБрдЯ рдФрд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдпреВрдирд┐рдХреНрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдореБрдЦреНрдп рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред (рд╡рд┐рдВрдбреЛрдЬ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рд╣реИ)ред
рдиреЛрдЯ: рдпрд╣ рд╡реАрдПрдо рдПрдХ рд╕рдХреНрд╖рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ ред рдпрд╣реА рд╣реИ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдЕрднреА рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ! рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдФрд░ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗрдВ рдХрд┐ рдХреБрдЫ рднреА рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реИред рдЕрдВрддрд┐рдо рдХреЛрдб рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ рдПрдХ рдкреНрд▓реЗрдХреНрд╕рд╕ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАред
1. рд╕рд╛рдордЧреНрд░реА
- рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
- рдкрд░рд┐рдЪрдп
- рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдПрд▓рд╕реА -3
- рдЕрд╕реЗрдВрдмрд▓рд░ рдЙрджрд╛рд╣рд░рдг
- рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди
- рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- рдирд┐рд░реНрджреЗрд╢ рдзреЛрдЦрд╛ рд╢реАрдЯ
- рдЗрдВрдЯрд░рдкреНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛
- рдмрд╛рдзрд┐рдд рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдзреЛрдЦрд╛ рд╢реАрдЯ
- рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
- рдореЗрдореЛрд░реА рдореИрдкрд┐рдВрдЧ рд░рдЬрд┐рд╕реНрдЯрд░
- рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реБрд╡рд┐рдзрд╛рдПрдБ
- рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк
- рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ C ++ рдореЗрдВ
2. рдкрд░рд┐рдЪрдп
рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреНрдпрд╛ рд╣реИ?
рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрдИ рдЕрдиреНрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЕрдВрдХрдЧрдгрд┐рдд рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрдореЛрд░реА рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдЬреИрд╕реЗ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╡реАрдПрдо рдПрдХ рдорд╢реАрди рднрд╛рд╖рд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡реАрдПрдо рд╕рд┐рдореБрд▓реЗрд╢рди рдХрд┐рддрдирд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЗрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рд╡реАрдПрдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрдм NES рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрддрд░ рдкрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдХреЗ NES рдХреЗ рд▓рд┐рдП рдЧреЗрдо рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдПрдореБрд▓реЗрдЯрд░реЛрдВ рдХреЛ рдореВрд▓ рдЙрдкрдХрд░рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ
рд╡рд┐рд╡рд░рдг рдФрд░ рд╣рд░ рдкреНрд░рдореБрдЦ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдШрдЯрдХ рдХреЛ
рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдиреНрдп рд╡реАрдПрдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рде рдХрдИ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ! рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдХрдВрдкреНрдпреВрдЯрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдПрдХ рдорд╛рдирдХ рдордВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдЬреЛ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреА рд╡рд┐рднрд┐рдиреНрди рдмреЛрд▓рд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╡реАрдПрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреА рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдиреЛрдЯ: рд╕рдВрдХрд▓рдХ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рдХреЗ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред VM рдПрдХ рдорд╛рдирдХ CPU рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡реАрдПрдо рдЬреИрд╕рд╛ рдХреЛрдИ рд░рди-рдЯрд╛рдЗрдо рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИред рдпрджреНрдпрдкрд┐ рд╕рдВрдХрд▓рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХрдИ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реАрдПрдо рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░, VM рдФрд░ рд╕рдВрдХрд▓рдХ рджреЛрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (JVM) рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдлрд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЬреЗрд╡реАрдПрдо рд╕реНрд╡рдпрдВ рдЖрдХрд╛рд░ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдордзреНрдпрдо рд╣реИ, рдпрд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдлреЛрди рд╕рд╣рд┐рдд рд╣рдЬрд╛рд░реЛрдВ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдирдП рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЬреЗрд╡реАрдПрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЛрдИ рднреА рд▓рд┐рдЦрд┐рдд рдЬрд╛рд╡рд╛, рдХреЛрдЯрд▓рд┐рди рдпрд╛ рдХреНрд▓реЛрдЬрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд┐рдирд╛ рдмрджрд▓рд╛рд╡ рдХреЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рд▓рд╛рдЧрдд рд╣реА рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдУрд╡рд░рд╣реЗрдб рд╣реЛрдЧреА рдФрд░ рдорд╢реАрди рд╕реНрддрд░ рд╕реЗ
рдЖрдЧреЗ рдЕрдореВрд░реНрдд рд╣реЛрдЧреА ред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рд╣реИред
рдПрдХ рд╡реАрдПрдо рдХреЛ рд╕рдорд╛рди рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝рд╛ рдпрд╛ рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреБрд░рд╛рдиреЗ
рд╡реАрдбрд┐рдпреЛ рдЧреЗрдо рдЕрдХреНрд╕рд░ рд╕рд░рд▓
рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ VMs рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рддреЗ рдереЗ ред
рд╡реАрдПрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрд▓рдЧ-рдерд▓рдЧ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдЖрд╡реЗрджрди рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рд╕реА рдпрд╛ рд╕реА ++ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣
рдХреЛ рд▓рд╛рдЧреВ
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреБрдЪреНрдЫ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдвреЗрд░ рдпрд╛ рдЪрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, VM рд░рдирд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо "рдмрд╛рд╣рд░" рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░
рдореЗрдореЛрд░реА рд╕реЗрд▓реНрд╕ рдХреЗ рд╕рднреА
рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг
Ethereum рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмреНрд▓реЙрдХрдЪреЗрди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡реИрд▓рд┐рдбреЗрд╢рди рдиреЛрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдСрдкрд░реЗрдЯрд░реНрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЬрдирдмрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЕрдкрдиреА рдорд╢реАрдиреЛрдВ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдзреНрдпрдпрди рдХреЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ред рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ
рд╡реАрдПрдо рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо, рдиреЗрдЯрд╡рд░реНрдХ, рдбрд┐рд╕реНрдХ, рдЖрджрд┐ рдХреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдПрдереЗрд░рд┐рдпрдо рднреА рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдХрдИ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
3. рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдПрд▓рд╕реА -3
рд╣рдорд╛рд░рд╛ VM
LC-3 рдирд╛рдордХ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред рдпрд╣рд╛рдВ,
x86 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕реЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ рд╕реАрдкреАрдпреВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрдбрд╝реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХреИрд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдЪрд▓реЛ рд╕реА рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЦрдВрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕реНрдореГрддрд┐
LC-3 рдореЗрдВ 65,536 рдореЗрдореЛрд░реА рд╕реЗрд▓ (2
16 ) рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 16-рдмрд┐рдЯ рдорд╛рди рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ 128 KB рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдмрд╣реБрдд рдХрдо! рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдпрд╣ рдореЗрдореЛрд░реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:
uint16_t memory[UINT16_MAX];
рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ
рд╕реАрдкреАрдпреВ рдореЗрдВ рдПрдХ рдорд╛рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдПрдХ рд╕реНрд▓реЙрдЯ рд╣реИред рд░рдЬрд┐рд╕реНрдЯрд░ рдПрдХ рд╕реАрдкреАрдпреВ "рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░" рдХреА рддрд░рд╣ рд╣реИрдВред рддрд╛рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдХреЗ рдХреБрдЫ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХреЗ, рдпрд╣ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рдХреБрдЫ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдХреЗ, рдЕрдиреНрдп рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
LC-3 рдореЗрдВ рдХреЗрд╡рд▓ 10 рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 16 рдмрд┐рдЯреНрд╕ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХреЛ рдЕрд╕рд╛рдЗрди рдХреА рдЧрдИ рднреВрдорд┐рдХрд╛рдПрдВ рд╣реИрдВред
- 8 рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рд░рдЬрд┐рд╕реНрдЯрд░ (
R0-R7
) - рдЯреАрдореЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ 1 рд░рдЬрд┐рд╕реНрдЯрд░ (
PC
) - 1 рд╢рд░реНрдд рдЭрдВрдбрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ (
COND
)
рдХрд┐рд╕реА рднреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдХрд╛рдЙрдВрдЯрд░ рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдореЗрдореЛрд░реА рдкрддрд╛ рд╣реИред рд╣рд╛рд▓рдд рдХреЗ рдЭрдВрдбреЗ рд╣рдореЗрдВ рдкрд┐рдЫрд▓реА рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддреЗ рд╣реИрдВред
enum { R_R0 = 0, R_R1, R_R2, R_R3, R_R4, R_R5, R_R6, R_R7, R_PC, R_COND, R_COUNT };
рд╕реНрдореГрддрд┐ рдХреА рддрд░рд╣, рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ:
uint16_t reg[R_COUNT];
рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ
рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдХрдорд╛рдВрдб рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореМрд▓рд┐рдХ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рдирдВрдмрд░ рдЬреЛрдбрд╝реЗрдВред рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдПрдХ
рдУрдкрдХреЛрдб (рдСрдкрд░реЗрд╢рди рдХреЛрдб) рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде
рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ
рдУрдкрдХреЛрдб рдПрдХ рдХрд╛рд░реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ "рдЬрд╛рдирддрд╛ рд╣реИ" рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реИред рдПрд▓рд╕реА -3 рдореЗрдВ 16 рдСрдкрдХреЛрдб рд╣реИрдВред рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗрд╡рд▓ рдЗрди рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреА рд▓рдВрдмрд╛рдИ 16 рдмрд┐рдЯреНрд╕ рд╣реИ, рдФрд░ рдмрд╛рдПрдВ 4 рдмрд┐рдЯреНрд╕ рдСрдкрд░реЗрд╢рди рдХреЛрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмрд╛рдж рдореЗрдВ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрдХреЛрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╕рд╣реА рдПрдирдо рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рд░рдЦреЗрдВ:
enum { OP_BR = 0, OP_ADD, OP_LD, OP_ST, OP_JSR, OP_AND, OP_LDR, OP_STR, OP_RTI, OP_NOT, OP_LDI, OP_STI, OP_JMP, OP_RES, OP_LEA, OP_TRAP };
рдиреЛрдЯ: Intel x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЬреИрд╕реЗ ARM рдФрд░ LC-3 рдмрд╣реБрдд рдХрдо рд╣реИрдВред рдЫреЛрдЯреЗ рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рдХреЛ RISC рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрдбрд╝реЗ рдХреЛ CISC рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдбрд╝реЗ рдЕрдиреБрджреЗрд╢ рд╕реЗрдЯ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ ред CISC рдХрд╛ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХрдИ RISC рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, CISC рдкреНрд░реЛрд╕реЗрд╕рд░ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдФрд░ рдорд╣рдВрдЧреЗ рд╣реИрдВред рдпрд╣ рдФрд░ рдЕрдиреНрдп рд╡реНрдпрд╛рдкрд╛рд░-рдмрдВрдж "рдЗрд╖реНрдЯрддрдо" рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ ред
рд╣рд╛рд▓рдд рдЭрдВрдбреЗ
R_COND
рд░рдЬрд┐рд╕реНрдЯрд░ рдЙрди рдХрдВрдбреАрд╢рди рдлреНрд▓реИрдЧ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ
if (x > 0) { ... }
ред
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реНрдЯреЗрдЯрд╕ рдлреНрд▓реИрдЧ рд╣реЛрддреЗ рд╣реИрдВред LC-3 рдХреЗрд╡рд▓ рддреАрди рдХрдВрдбреАрд╢рди рдлрд╝реНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реА рдЧрдгрдирд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
enum { FL_POS = 1 << 0, FL_ZRO = 1 << 1, FL_NEG = 1 << 2, };
рдиреЛрдЯ: (рдЪрд░рд┐рддреНрд░ <<
рдХреЛ рд▓реЗрдлреНрдЯ рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред (n << k)
рдмрд┐рдЯреНрд╕ n
k
рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, 1 << 2
рдмрд░рд╛рдмрд░ 4
рдпрд╣рд╛рдВ рдкрдврд╝реЗрдВ рдпрджрд┐ рдЖрдк рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛)ред
рд╣рдордиреЗ рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдШрдЯрдХреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ! рдорд╛рдирдХ рд╕рдорд╛рд╡реЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж (рдКрдкрд░ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ), рдЖрдкрдХреА рдлрд╝рд╛рдЗрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
{Includes, 12} {Registers, 3} {Opcodes, 3} {Condition Flags, 3}
рдпрд╣рд╛рдВ рд▓реЗрдЦ рдХреЗ рдЧрд┐рдиреЗ рд╣реБрдП рдЦрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЖрддреЗ рд╣реИрдВред рд╕рдВрдкреВрд░реНрдг рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рджреЗрдЦреЗрдВ - рд▓рдЧрднрдЧред рдкреНрд░рддрд┐ред4. рдЕрд╕реЗрдВрдмрд▓рд░ рдЙрджрд╛рд╣рд░рдг
рдЕрдм, LC-3 рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╛ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рдордЭреЗрдВред рдмрд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рд╣реИ:
.ORIG x3000 ; this is the address in memory where the program will be loaded LEA R0, HELLO_STR ; load the address of the HELLO_STR string into R0 PUTs ; output the string pointed to by R0 to the console HALT ; halt the program HELLO_STR .STRINGZ "Hello World!" ; store this string here in the program .END ; mark the end of the file
рд╕реА рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдПрдХ рдмрдпрд╛рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЛрдИ рдирд╕реНрдЯреЗрдб рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИрдВ
{}
рдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЬреИрд╕реЗ рдХрд┐
if
рдпрд╛
while
; рдмрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдПрдХ рд╕рд░рд▓ рд╕реВрдЪреАред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдирд╛рдо рдЙрди opcodes рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ 16 рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИред рдРрд╕рд╛ рдмреЗрдореЗрд▓ рд╡рд┐рд╡рд╛рд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ?
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рдХреЛрдб рд╣рдо рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣
рдЕрд╕реЗрдВрдмрд▓реА рд▓реИрдВрдЧреНрд╡реЗрдЬ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ - рдкреНрд▓реЗрди-рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ, рдкрдардиреАрдп рдФрд░ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд░реВрдк рдореЗрдВред рдПрдХ рдЙрдкрдХрд░рдг, рдЬрд┐рд╕реЗ
рдЕрд╕реЗрдореНрдмрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╛рда рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ 16-рдмрд┐рдЯ рдмрд╛рдЗрдирд░реА рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕рдордЭрддреА рд╣реИред рдпрд╣ рдмрд╛рдЗрдирд░реА рдлреЙрд░реНрдо, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ 16-рдмрд┐рдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ,
рдорд╢реАрди рдХреЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдиреЛрдЯ: рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╕рдорд╛рди рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдкрд╛рда рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ, рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рдмрд╛рдЗрдирд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ред
.ORIG
рдФрд░
.STRINGZ
рдирд┐рд░реНрджреЗрд╢ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд╣реАрдВред рдпреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдпрд╛ рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
.STRINGZ
рдПрдХ рдмрд╛рдЗрдирд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдерд╛рди рдкрд░ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЧреЛрдЯреЛ рдЬреИрд╕реЗ рдмрдпрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реВрдк рдФрд░ рд╢рд░реНрддреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ 10 рддрдХ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
AND R0, R0, 0 ; clear R0 LOOP ; label at the top of our loop ADD R0, R0, 1 ; add 1 to R0 and store back in R0 ADD R1, R0, -10 ; subtract 10 from R0 and store back in R1 BRn LOOP ; go back to LOOP if the result was negative ... ; R0 is now 10!
рдиреЛрдЯ: рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рд╕реАрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк LC-3 рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ LC-3 рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рдФрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
5. рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ VM рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡реАрдПрдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреА рдкреВрд░реА рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬрдм рддрдХ рдЖрдк рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ
рдХреЛрдИ рднреА LC-3 рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЪрд╛рд╣реЗ рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд┐рддрдиреА рднреА рд╣реЛред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рд╡реАрдПрдо рднреА рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпрд╛ рд▓рд┐рдирдХреНрд╕ рдХреА рддрд░рд╣ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ!
рдпрджрд┐ рдЖрдк рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рджрд╛рд░реНрд╢рдирд┐рдХ рд░реВрдк рд╕реЗ рдЕрджреНрднреБрдд рд╡рд┐рдЪрд╛рд░ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрд╡рдпрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдо рдХрднреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЙрдирдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд░рд▓ рдХреЛрдб рддрдХ рд╕реАрдорд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗ! рдЙрд╕реА рд╕рдордп, рд╣рдо рд╕рдм рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВред рдЯреНрдпреВрд░рд┐рдВрдЧ рдиреЗ рдЗрд╕ рдЕрджреНрднреБрдд рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛:
"рдпрд╣ рд░рд╛рдп рдХрд┐ рдорд╢реАрдиреЗрдВ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреБрдЫ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд░, рдЬреЛ рдЧрдгрд┐рддрдЬреНрдЮреЛрдВ рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦрддрд░рд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдХреБрдЫ рддрдереНрдп рдорди рдХреА рд╕рдВрдкрддреНрддрд┐ рдмрди рдЧрдП рд╣реИрдВ, рддреБрд░рдВрдд рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рднреА рдкрд░рд┐рдгрд╛рдо рдорди рдХреА рд╕рдВрдкрддреНрддрд┐ рдмрди рдЬрд╛рдПрдВрдЧреЗред " - рдПрд▓рди рдПрдоред рдЯреНрдпреВрд░рд┐рдВрдЧ
рдкреНрд░рдХреНрд░рд┐рдпрд╛
рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рдЯреАрдХ рд╡рд┐рд╡рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
PC
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдкрддреЗ рдкрд░ рдореЗрдореЛрд░реА рд╕реЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВредPC
рд░рдЬрд┐рд╕реНрдЯрд░ рдмрдврд╝рд╛рдПрдБред- рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП opcode рджреЗрдЦреЗрдВред
- рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
- рдЪрд░рдг 1 рдкрд░ рд▓реМрдЯреЗрдВред
рдЖрдк рд╕рд╡рд╛рд▓ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ: "рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд▓реВрдк рдХрд╛рдЙрдВрдЯрд░ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдирд┐рд░реНрджреЗрд╢ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ?" рдЬрд╡рд╛рдм рд╣реИ рдирд╣реАрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдХреБрдЫ рдЧреЛрдЯреЛ рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢
PC
рдЪрд╛рд░реЛрдВ рдУрд░ рдХреВрджрдХрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рд╣рдо рдореБрдЦреНрдп рдЪрдХреНрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
int main(int argc, const char* argv[]) { {Load Arguments, 12} {Setup, 12} enum { PC_START = 0x3000 }; reg[R_PC] = PC_START; int running = 1; while (running) { uint16_t instr = mem_read(reg[R_PC]++); uint16_t op = instr >> 12; switch (op) { case OP_ADD: {ADD, 6} break; case OP_AND: {AND, 7} break; case OP_NOT: {NOT, 7} break; case OP_BR: {BR, 7} break; case OP_JMP: {JMP, 7} break; case OP_JSR: {JSR, 7} break; case OP_LD: {LD, 7} break; case OP_LDI: {LDI, 6} break; case OP_LDR: {LDR, 7} break; case OP_LEA: {LEA, 7} break; case OP_ST: {ST, 7} break; case OP_STI: {STI, 7} break; case OP_STR: {STR, 7} break; case OP_TRAP: {TRAP, 8} break; case OP_RES: case OP_RTI: default: {BAD OPCODE, 7} break; } } {Shutdown, 12} }
6. рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдм рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдкреНрд░рддреНрдпреЗрдХ рдУрдкрдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдирд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣рд╛рдБ рдореИрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬреЛрдбрд╝реЗрдВ
ADD
рдирд┐рд░реНрджреЗрд╢ рджреЛ рдирдВрдмрд░ рд▓реЗрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдкреГрд╖реНрда 526 рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ
ADD
рдЕрдиреБрджреЗрд╢ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдЖрд░реЗрдЦ рдореЗрдВ рджреЛ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ "рдореЛрдб" рд╣реИрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рд╡рд┐рдзрд╛рдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реВрдВ, рдЖрдЗрдП рдЙрдирдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛рдПрдВ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рджреЛрдиреЛрдВ рдЪрд╛рд░ рд╕рдорд╛рди рдмрд┐рдЯреНрд╕
0001
рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣
OP_ADD
рд▓рд┐рдП opcode рдореВрд▓реНрдп рд╣реИред рдЕрдЧрд▓реЗ рддреАрди рдмрд┐рдЯреНрд╕ рдЖрдЙрдЯрдкреБрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП
DR
рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред рдЖрдЙрдЯрдкреБрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рд╣ рд╕реНрдерд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд░рд╛рд╢рд┐ рдЬрдорд╛ рд╣реЛрддреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рдмрд┐рдЯреНрд╕ рд╣реИрдВ:
SR1
ред рдпрд╣ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рдирдВрдмрд░ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрд╣рд╛рдБ рд╕рд╣реЗрдЬрдирд╛ рд╣реИ, рдФрд░ рд╣рдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдирдВрдмрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╛рдХреА рд╣реИред рдпрд╣рд╛рдВ рджреЛрдиреЛрдВ рд░реЗрдЦрд╛рдПрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ 5 рд╡реАрдВ рдмрд┐рдЯ рд╢реАрд░реНрд╖ рдкрд░ 0 рд╣реИ рдФрд░ 1. рд╕рдмрд╕реЗ рдиреАрдЪреЗ рд╣реИред рдпрд╣ рдмрд┐рдЯ рдпрд╛ рддреЛ
рд╕реАрдзреЗ рдореЛрдб рдпрд╛
рд░рдЬрд┐рд╕реНрдЯрд░ рдореЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА
рд╣реИ ред рд░рдЬрд┐рд╕реНрдЯрд░ рдореЛрдб рдореЗрдВ, рджреВрд╕рд░рд╛ рдирдВрдмрд░ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ
SR2
рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд┐рдЯреНрд╕ рджреЛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдмрд┐рдЯреНрд╕ 3 рдФрд░ 4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛:
ADD R2 R0 R1 ; add the contents of R0 to R1 and store in R2.
рддрддреНрдХрд╛рд▓ рдореЛрдб рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рддрддреНрдХрд╛рд▓ рдореВрд▓реНрдп рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣реА рдПрдореНрдмреЗрдбреЗрдб рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрджреЗрд╢ рдХреЗ рдЕрдВрджрд░ рд╣реИ рдЬрдм рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡реНрдпрд╛рдкрд╛рд░-рдмрдВрдж рдпрд╣ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрддрдо 2
5 = 32ред рдпрд╣ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИред рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
ADD R0 R0 1 ; add 1 to R0 and store back in R0
рдпрд╣рд╛рдБ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдПрдХ рдЕрдВрд╢ рд╣реИ:
рдпрджрд┐ рдмрд┐рдЯ [5] 0 рд╣реИ, рддреЛ SR2 рд╕реЗ рджреВрд╕рд░рд╛ рд╕реНрд░реЛрдд рдСрдкрд░реЗрдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдмрд┐рдЯ [5] 1 рд╣реИ, рддреЛ рджреВрд╕рд░реЗ рд╕реНрд░реЛрдд рдСрдкрд░реЗрдВрдб рдХреЛ imm5 рд╕реЗ 16 рдмрд┐рдЯ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, SR1 рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рджреВрд╕рд░рд╛ рд╕реНрд░реЛрдд рдСрдкрд░реЗрдВрдб рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо DR рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдкреГрд╖реНрда релреирем)
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдХреА рдереАред рд▓реЗрдХрд┐рди "рдЕрд░реНрде рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░" рдХреНрдпрд╛ рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддреНрдпрдХреНрд╖ рдореЛрдб рдореЗрдВ рдореВрд▓реНрдп рдореЗрдВ рдХреЗрд╡рд▓ 5 рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рдЗрд╕реЗ 16-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрди 5 рдмрд┐рдЯреНрд╕ рдХреЛ рджреВрд╕рд░реЗ рдирдВрдмрд░ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 16 рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд▓рд╛рдкрддрд╛ рдмрд┐рдЯреНрд╕ рдХреЛ рднрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рди рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдВрдЪ рдмрд┐рдЯреНрд╕ рдореЗрдВ
1 1111
ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рднрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ
0000 0000 0001 1111
рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ 32 рд╣реИ! рдореВрд▓реНрдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯреНрд╕ рдХреЛ рднрд░рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
uint16_t sign_extend(uint16_t x, int bit_count) { if ((x >> (bit_count - 1)) & 1) { x |= (0xFFFF << bit_count); } return x; }
рдиреЛрдЯ: рдпрджрд┐ рдЖрдк рдмрд╛рдЗрдирд░реА рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдмрд╕ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░реЗрдВ рдЬрдм рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдорд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдп рд╣реИ:
рдкрд░рд┐рдгрд╛рдо рдХреЛрдб рдирдХрд╛рд░рд╛рддреНрдордХ, рд╢реВрдиреНрдп рдпрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред (рдкреГрд╖реНрда релреирем)
рдкрд╣рд▓реЗ рд╣рдордиреЗ рдЭрдВрдбреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЕрдм рдЗрди рдЭрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдПрдХ рдореВрд▓реНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
void update_flags(uint16_t r) { if (reg[r] == 0) { reg[R_COND] = FL_ZRO; } else if (reg[r] >> 15) { reg[R_COND] = FL_NEG; } else { reg[R_COND] = FL_POS; } }
рдЕрдм рд╣рдо
ADD
рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t r1 = (instr >> 6) & 0x7; uint16_t imm_flag = (instr >> 5) & 0x1; if (imm_flag) { uint16_t imm5 = sign_extend(instr & 0x1F, 5); reg[r0] = reg[r1] + imm5; } else { uint16_t r2 = instr & 0x7; reg[r0] = reg[r1] + reg[r2]; } update_flags(r0); }
рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рддреЛ рдЖрдЗрдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВред
ADD
рджреЛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред- рд░рдЬрд┐рд╕реНрдЯрд░ рдореЛрдб рдореЗрдВ, рдЬреЛрдбрд╝рд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджреВрд╕рд░рд╛ рдореВрд▓реНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╣реИред
- рдкреНрд░рддреНрдпрдХреНрд╖ рдореЛрдб рдореЗрдВ, рджреВрд╕рд░рд╛ рдорд╛рди рдирд┐рд░реНрджреЗрд╢ рдХреЗ 5 рдмрд┐рдЯреНрд╕ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реИред
- 16 рдмрд┐рдЯреНрд╕ рд╕реЗ рдХрдо рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╣рд░ рдмрд╛рд░ рдЕрдиреБрджреЗрд╢ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рд╛рд▓рдд рдХреЗ рдЭрдВрдбреЗ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
15 рдФрд░ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдХрд░ рдЖрдк рдЕрднрд┐рднреВрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рд░реНрджреЗрд╢ рдореВрд▓реНрдп рд╡рд┐рд╕реНрддрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдореЛрдб рдФрд░ рдзреНрд╡рдЬ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
LDI
LDI рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЕрдкреНрд░рддреНрдпрдХреНрд╖" рдпрд╛ "рдЕрдкреНрд░рддреНрдпрдХреНрд╖" рд▓реЛрдбрд┐рдВрдЧ (рдЕрдкреНрд░рддреНрдпрдХреНрд╖)ред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдореЛрд░реА рд▓реЛрдХреЗрд╢рди рдХреЗ рдорд╛рди рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреГрд╖реНрда 532 рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ред
рдпрд╣рд╛рдБ рдмрд╛рдЗрдирд░реА рд▓реЗрдЖрдЙрдЯ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
ADD
рд╡рд┐рдкрд░реАрдд, рдХреЛрдИ рдореЛрдб рдФрд░ рдХрдо рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░, рдСрдкрд░реЗрд╢рди рдХреЛрдб
1010
, рдЬреЛ
OP_LDI
рд╡реИрд▓реНрдпреВ
OP_LDI
рд╕реЗ рдореЗрд▓
OP_LDI
ред рдлрд┐рд░, рд╣рдо рд▓реЛрдб рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди-рдмрд┐рдЯ
DR
(рдЖрдЙрдЯрдкреБрдЯ рд░рдЬрд┐рд╕реНрдЯрд░) рджреЗрдЦрддреЗ рд╣реИрдВред рд╢реЗрд╖ рдмрд┐рдЯреНрд╕ рдХреЛ
PCoffset9
рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛
PCoffset9
ред рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрддреНрдХрд╛рд▓ рдореВрд▓реНрдп рд╣реИ (
imm5
рд╕рдорд╛рди)ред рдЪреВрдВрдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд╣реИ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдорд╛рди рдХреЛ рдХрд╣рд╛рдВ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВ:
рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдореВрд▓реНрдп рдХреЗ рдмрд┐рдЯреНрд╕ [8:0]
рдХреЛ 16 рдмрд┐рдЯ рддрдХ рдмрдврд╝рд╛рдХрд░ рдФрд░ рдЗрд╕ рдорд╛рди рдХреЛ рдмрдврд╝реЗ рд╣реБрдП PC
рдЬреЛрдбрд╝рдХрд░ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдкрддреЗ рдкрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ DR
рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред (рдкреГрд╖реНрда релрейреи)
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдЗрд╕ 9-рдмрд┐рдЯ рдорд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди
PC
рдЬреЛрдбрд╝реЗрдВред (рдпрджрд┐ рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдЪрдХреНрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж
PC
рдмрдврд╝ рдЧрдпрд╛)ред рдкрд░рд┐рдгрд╛рдореА рдпреЛрдЧ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд╛рди рдХрд╛ рдкрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкрддреЗ
рдореЗрдВ рдПрдХ рдФрд░ рдореВрд▓реНрдп рд╣реИ, рдЬреЛ рд▓реЛрдб рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рд╣реИред
рдпрд╣ рд╕реНрдореГрддрд┐ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЛрд▓ рдЪрдХреНрдХрд░ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
LD
рдирд┐рд░реНрджреЗрд╢ 9 рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рдкрддреЗ рдСрдлрд╝рд╕реЗрдЯ рддрдХ рд╕реАрдорд┐рдд рд╣реИ, рдЬрдмрдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ 16 рдмрд┐рдЯреНрд╕ рдХреЗ рдкрддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
LDI
рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рдХрд╣реАрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд┐рдо рд╕реНрдерд╛рди рдХрд╛ рдкрддрд╛ рдкрд╛рд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕реЗ C рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ:
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣,
DR
рдХреЛ рдорд╛рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЭрдВрдбреЗ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдкрд░рд┐рдгрд╛рдо рдХреЛрдб рдирдХрд╛рд░рд╛рддреНрдордХ, рд╢реВрдиреНрдп рдпрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред (рдкреГрд╖реНрда релрейреи)
рдпрд╣рд╛рдБ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ: (
mem_read
рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА
mem_read
):
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t pc_offset = sign_extend(instr & 0x1ff, 9); reg[r0] = mem_read(mem_read(reg[R_PC] + pc_offset)); update_flags(r0); }
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ
ADD
рд▓рд┐рдЦрддреЗ рд╕рдордп рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХреЛрдб рдФрд░ рдЬреНрдЮрд╛рди рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдмрд╛рдХреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реИред
рдЕрдм рдЖрдкрдХреЛ рдмрд╛рдХреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рджреЛ
OP_RTI
рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА:
OP_RTI
рдФрд░
OP_RES
ред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рд╡реАрдПрдо рдХрд╛ рдереЛрдХ рдкреВрд░рд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
7. рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╛рд▓рдирд╛
рдпрджрд┐ рдЖрдк рдЕрдЯрдХреЗ рд╣реБрдП рд╣реИрдВ рддреЛ рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╢реЗрд╖ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкреВрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдЖрд░рдЯреАрдЖрдИ рдФрд░ рдЖрд░рдИрдПрд╕
(рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)
abort();
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t r1 = (instr >> 6) & 0x7; uint16_t imm_flag = (instr >> 5) & 0x1; if (imm_flag) { uint16_t imm5 = sign_extend(instr & 0x1F, 5); reg[r0] = reg[r1] & imm5; } else { uint16_t r2 = instr & 0x7; reg[r0] = reg[r1] & reg[r2]; } update_flags(r0); }
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t r1 = (instr >> 6) & 0x7; reg[r0] = ~reg[r1]; update_flags(r0); }
рд╢рд╛рдЦрд╛
{ uint16_t pc_offset = sign_extend((instr) & 0x1ff, 9); uint16_t cond_flag = (instr >> 9) & 0x7; if (cond_flag & reg[R_COND]) { reg[R_PC] += pc_offset; } }
рдХреВрдж
RET
рдХреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдПрдХ рдФрд░ рдХрдорд╛рдВрдб рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
JMP
рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред рдЬрдм рднреА
R1
7 рд╣реЛрддрд╛ рд╣реИ рддреЛ
RET
рд╣реЛрддрд╛ рд╣реИред
{ uint16_t r1 = (instr >> 6) & 0x7; reg[R_PC] = reg[r1]; }
рдХреВрдж рд░рдЬрд┐рд╕реНрдЯрд░
{ uint16_t r1 = (instr >> 6) & 0x7; uint16_t long_pc_offset = sign_extend(instr & 0x7ff, 11); uint16_t long_flag = (instr >> 11) & 1; reg[R_R7] = reg[R_PC]; if (long_flag) { reg[R_PC] += long_pc_offset; } else { reg[R_PC] = reg[r1]; } break; }
рднрд╛рд░
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t pc_offset = sign_extend(instr & 0x1ff, 9); reg[r0] = mem_read(reg[R_PC] + pc_offset); update_flags(r0); }
рд▓реЛрдб рд░рдЬрд┐рд╕реНрдЯрд░
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t r1 = (instr >> 6) & 0x7; uint16_t offset = sign_extend(instr & 0x3F, 6); reg[r0] = mem_read(reg[r1] + offset); update_flags(r0); }
рдкреНрд░рднрд╛рд╡реА рд▓реЛрдб рдкрддрд╛
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t pc_offset = sign_extend(instr & 0x1ff, 9); reg[r0] = reg[R_PC] + pc_offset; update_flags(r0); }
рджреБрдХрд╛рди
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t pc_offset = sign_extend(instr & 0x1ff, 9); mem_write(reg[R_PC] + pc_offset, reg[r0]); }
рджреБрдХрд╛рди рдЕрдкреНрд░рддреНрдпрдХреНрд╖
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t pc_offset = sign_extend(instr & 0x1ff, 9); mem_write(mem_read(reg[R_PC] + pc_offset), reg[r0]); }
рд╕реНрдЯреЛрд░ рд░рдЬрд┐рд╕реНрдЯрд░
{ uint16_t r0 = (instr >> 9) & 0x7; uint16_t r1 = (instr >> 6) & 0x7; uint16_t offset = sign_extend(instr & 0x3F, 6); mem_write(reg[r1] + offset, reg[r0]); }
8. рдмрд╛рдзрд┐рдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛
LC-3 рдЖрдо рдХрд╛рд░реНрдпреЛрдВ рдФрд░ I / O рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рджрд┐рдирдЪрд░реНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд▓рд╛рдЗрдиреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЯреНрд░реИрдк рд░реВрдЯреАрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк LC-3 рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ API рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдХ рдмрд╛рдзрд╛ рдХреЛрдб (рдЯреНрд░реИрдк рдХреЛрдб) рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ (рдУрдкреЛрдб рдХреЗ рд╕рдорд╛рди)ред
рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, TRAP
рд╡рд╛рдВрдЫрд┐рдд рд╕рдмрдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ редрдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдзрд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП enum рд╕реЗрдЯ рдХрд░реЗрдВ: enum { TRAP_GETC = 0x20, TRAP_OUT = 0x21, TRAP_PUTS = 0x22, TRAP_IN = 0x23, TRAP_PUTSP = 0x24, TRAP_HALT = 0x25 };
рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХреЛрдб рдХреНрдпреЛрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ LC-3 рдХреЛ рдХрд┐рд╕реА рднреА рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ C)ред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ LC-3 рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛрдб рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ ред рдЬрдм рдПрдХ рдмрд╛рдзрд╛ рдХреЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдЗрд╕ рдХреЛрдб рдХреЗ рдкрддреЗ рдкрд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдкреАрдпреВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдЙрд╕ PC
рд╕реНрдерд╛рди рдкрд░ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡реНрдпрд╡рдзрд╛рди рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдерд╛ред: 0x3000
0x0
. , .
рд╡реНрдпрд╡рдзрд╛рди рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреЛрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИ : рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдореЗрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реА рдореЗрдВ рд▓рд┐рдЦрдХрд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред рдЬрдм рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╕реА рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рдж, рдирд┐рд░реНрджреЗрд╢ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛редрдпрджреНрдпрдкрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рднреМрддрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ LC-3 рдРрд╕рд╛ рд╣реЛрдЧрд╛, рдпрд╣ VM рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрджрд┐рдо рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдУрдПрд╕ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛, рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛редрдиреЛрдЯ: рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рд╣реИред рдЕрд╕реЗрдВрдмрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рд╣реЛрддрд╛ рд╣реИ! рдЙрдкрдпреБрдХреНрдд рдУрдПрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдкрд╣рд▓реЗ рд╢рд╛рдВрддрд┐ рд╕реЗ рд╕реЛ рд╕рдХрддрд╛ рд╣реИред
Opcode рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рд╡рд┐рдХрд▓реНрдк рдСрдкрд░реЗрдЯрд░ рдореЗрдВ, TRAP
рдПрдХ рдФрд░ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝реЗрдВ: switch (instr & 0xFF) { case TRAP_GETC: {TRAP GETC, 9} break; case TRAP_OUT: {TRAP OUT, 9} break; case TRAP_PUTS: {TRAP PUTS, 8} break; case TRAP_IN: {TRAP IN, 9} break; case TRAP_PUTSP: {TRAP PUTSP, 9} break; case TRAP_HALT: {TRAP HALT, 9} break; }
рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдмрд╛рдХреА рдХреЛ рдЦреБрдж рдХрд░рдирд╛ рд╣реИредрдбрд╛рд▓рддрд╛ рд╣реИ
рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛрдб PUTS
рдПрдХ рдЯрд░реНрдорд┐рдиреЗрдЯрд┐рдВрдЧ рдЬреАрд░реЛ (рдЗрд╕реА рддрд░рд╣ printf
C) рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдкреГрд╖реНрда 543 рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛редрд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрдВрдЯрд░рдкреНрдЯ рд░реВрдЯреАрди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ R0
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╣рд▓реЗ рдЪрд░рд┐рддреНрд░ рдХреЗ рдкрддреЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ редрд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рд╕реЗ:рдХрдВрд╕реЛрд▓ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ ASCII рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рд╡рд░реНрдг рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐ рд╕реЗрд▓ рдПрдХ рд╡рд░реНрдг, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ R0
ред рдЖрдЙрдЯрдкреБрдЯ рддрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореЗрдореЛрд░реА рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ x0000
ред (рдкреГрд╖реНрда релрекрей)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣рд╛рдВ рд╡рд░реНрдг рдПрдХ рдмрд╛рдЗрдЯ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред LC-3 рдХреА рдореЗрдореЛрд░реА рд▓реЛрдХреЗрд╢рди 16 рдмрд┐рдЯреНрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреИрд░реЗрдХреНрдЯрд░ 16 рдмрд┐рдЯреНрд╕ рд╣реИред рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЛ рдПрдХ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред { uint16_t* c = memory + reg[R_R0]; while (*c) { putc((char)*c, stdout); ++c; } fflush(stdout); }
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реА рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рддреЛ рд░реБрдХрд╛рд╡рдЯ рджрд┐рдирдЪрд░реНрдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЕрдм рдРрдирдХ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдмрд╛рдХреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреВрд░реНрдг рдХреЛрдб рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред9. рдмрд╛рдзрд┐рдд рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдзреЛрдЦрд╛ рд╢реАрдЯ
рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╢реЗрд╖ рд╡реНрдпрд╡рдзрд╛рди рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВредрдЪрд░рд┐рддреНрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
reg[R_R0] = (uint16_t)getchar();
рдЪрд░рд┐рддреНрд░ рдЙрддреНрдкрд╛рджрди
putc((char)reg[R_R0], stdout); fflush(stdout);
рдЪрд░рд┐рддреНрд░ рдЗрдирдкреБрдЯ рдЕрдиреБрд░реЛрдз
printf("Enter a character: "); reg[R_R0] = (uint16_t)getchar();
рд▓рд╛рдЗрди рдЖрдЙрдЯрдкреБрдЯ
{ uint16_t* c = memory + reg[R_R0]; while (*c) { char char1 = (*c) & 0xFF; putc(char1, stdout); char char2 = (*c) >> 8; if (char2) putc(char2, stdout); ++c; } fflush(stdout); }
рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрддрд┐
puts("HALT"); fflush(stdout); running = 0;
10. рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛
рд╣рдордиреЗ рдореЗрдореЛрд░реА рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдмрд╛рдд рдХреА, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ? рдХреЛрдб рдХреЛрдб рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдкрд░рд┐рдгрд╛рдо рдПрдХ рдлрд╛рдЗрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред рдЗрд╕реЗ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдкрддреЗ рдкрд░ рд╕реАрдзреЗ рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдХрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд╣рд▓реЗ 16 рдмрд┐рдЯреНрд╕ рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрддреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкрддреЗ рдХреЛ рдореВрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реЗрд╖ рдбреЗрдЯрд╛ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИредрдпрд╣рд╛рдБ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ LC-3 рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдб рд╣реИ: void read_image_file(FILE* file) { uint16_t origin; fread(&origin, sizeof(origin), 1, file); origin = swap16(origin); uint16_t max_read = UINT16_MAX - origin; uint16_t* p = memory + origin; size_t read = fread(p, sizeof(uint16_t), max_read, file); while (read-- > 0) { *p = swap16(*p); ++p; } }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ swap16
ред рдПрд▓рд╕реА -3 рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рддреНрдпрдХреНрд╖ рдмрд╛рдЗрдЯ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдПрдХ рдХреЛ рдлреНрд▓рд┐рдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ uint16
ред (рдпрджрд┐ рдЖрдк рдЧрд▓рддреА рд╕реЗ рдкреАрдкреАрд╕реА рдЬреИрд╕реЗ рдПрдХ рдЕрдЬреАрдм рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред uint16_t swap16(uint16_t x) { return (x << 8) | (x >> 8); }
рдиреЛрдЯ: рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ, рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрдХ рд╣реИ, рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдирд┐рд░реНрдгрдп рдЬреНрдпрд╛рджрд╛рддрд░ рдордирдорд╛рдирд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдХрдВрдкрдирд┐рдпреЛрдВ рдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрдгрдп рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдлрд╝рдВрдХреНрд╢рди рднреА рдЬреЛрдбрд╝реЗрдВ read_image_file
, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрде рд▓реЗрддрд╛ рд╣реИ: int read_image(const char* image_path) { FILE* file = fopen(image_path, "rb"); if (!file) { return 0; }; read_image_file(file); fclose(file); return 1; }
11. рдореИрдк рдХрд┐рдП рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░
рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд┐рдпрдорд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕реНрдореГрддрд┐ рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрддрд╛ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ рдЙрдирдХреА рд╕реНрдореГрддрд┐ рдХреЛ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА-рдореИрдкреНрдб рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЖрдорддреМрд░ рдкрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрд╣рдорд╛рд░реЗ LC-3 рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдЕрдиреБрдкрдпреЛрдЧреА рд░рдЬрд┐рд╕реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреАрдмреЛрд░реНрдб рд╕реНрдЯреЗрдЯрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ ( KBSR
) рдФрд░ рдХреАрдмреЛрд░реНрдб рдбреЗрдЯрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ ( KBDR
) рд╣реИред рдкрд╣рд▓рд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреБрдВрдЬреА рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИредрдпрджреНрдпрдкрд┐ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ GETC
, рдпрд╣ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред KBSR
рдФрд░ KBDR
рдЕрдиреБрдорддрд┐ рджреЗрдВрдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛рддреЗ рд╕рдордп рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдкреВрдЫрддрд╛рдЫ рдХрд░реЗрдВ , рддрд╛рдХрд┐ рдЗрдирдкреБрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЙрддреНрддрд░рджрд╛рдпреА рд░рд╣реЗред enum { MR_KBSR = 0xFE00, MR_KBDR = 0xFE02 };
рдореИрдк рдХрд┐рдП рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдереЛрдбрд╝реА рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╣рдо рд╕реАрдзреЗ рдореЗрдореЛрд░реА рдПрд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рд╕реЗрдЯрд░ рдФрд░ рдЧреЗрдЯреНрдЯрд░ред рдХреЗрдмреАрдПрд╕рдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЧреЗрдЯрдмреЛрд░реНрдб рдХреАрдмреЛрд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рдореЗрдВ рджреЛрдиреЛрдВ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред void mem_write(uint16_t address, uint16_t val) { memory[address] = val; } uint16_t mem_read(uint16_t address) { if (address == MR_KBSR) { if (check_key()) { memory[MR_KBSR] = (1 << 15); memory[MR_KBDR] = getchar(); } else { memory[MR_KBSR] = 0; } } return memory[address]; }
рдпрд╣ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдЕрдВрддрд┐рдо рдШрдЯрдХ рд╣реИ! рдпрджрд┐ рдЖрдкрдиреЗ рд╢реЗрд╖ рд╡реНрдпрд╡рдзрд╛рди рджрд┐рдирдЪрд░реНрдпрд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ!рдирд┐рдореНрди рдХреНрд░рдо рдореЗрдВ рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╕рдм рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: {Memory Mapped Registers, 11} {TRAP Codes, 8} {Memory Storage, 3} {Register Storage, 3} {Functions, 12} {Main Loop, 5}
12. рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреАрдмреЛрд░реНрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреБрдЫ рдердХрд╛рдК рд╡рд┐рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдпрд╛ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдлреНрд░реА рдХреЙрдкреА рдкреЗрд╕реНрдЯ рдорд╣рд╕реВрд╕ рдХрд░реЛ!рдпрджрд┐ рдЖрдк рд╡рд┐рдиреНрдбреЛрдЬрд╝ рдЬреИрд╕реЗ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╡реАрдПрдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдВрдбреЛрдЬ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред uint16_t check_key() { fd_set readfds; FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; return select(1, &readfds, NULL, NULL, &timeout) != 0; }
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рддрд░реНрдХреЛрдВ рд╕реЗ рд░рд╛рд╕реНрддрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ рдпрджрд┐ рд╡реЗ рдЧрд╛рдпрдм рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВред if (argc < 2) { printf("lc3 [image-file1] ...\n"); exit(2); } for (int j = 1; j < argc; ++j) { if (!read_image(argv[j])) { printf("failed to load image: %s\n", argv[j]); exit(1); } }
рдпреВрдирд┐рдХреНрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯрд░реНрдорд┐рдирд▓ рдЗрдирдкреБрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛрдбред struct termios original_tio; void disable_input_buffering() { tcgetattr(STDIN_FILENO, &original_tio); struct termios new_tio = original_tio; new_tio.c_lflag &= ~ICANON & ~ECHO; tcsetattr(STDIN_FILENO, TCSANOW, &new_tio); } void restore_input_buffering() { tcsetattr(STDIN_FILENO, TCSANOW, &original_tio); }
рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЛ рдЙрд╕рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред void handle_interrupt(int signal) { restore_input_buffering(); printf("\n"); exit(-2); }
signal(SIGINT, handle_interrupt); disable_input_buffering();
restore_input_buffering();
{Sign Extend, 6} {Swap, 10} {Update Flags, 6} {Read Image File, 10} {Read Image, 10} {Check Key, 12} {Memory Access, 11} {Input Buffering, 12} {Handle Interrupt, 12}
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <signal.h> #include <unistd.h> #include <fcntl.h> #include <sys/time.h> #include <sys/types.h> #include <sys/termios.h> #include <sys/mman.h>
рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк
рдЕрдм рдЖрдк LC-3 рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛ рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ!- рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ ред
- 2048 рдпрд╛ рджреБрд╖реНрдЯ рдХрд╛ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред
- рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ obj рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдБ:
lc3-vm path/to/2048.obj
- 2048 рдореЗрдВ рдЦреЗрд▓реЗрдВ!
Control the game using WASD keys. Are you on an ANSI terminal (y/n)? y +--------------------------+ | | | | | | | 2 | | | | 2 | | | | | | | +--------------------------+
рдбрд┐рдмрдЧрд┐рдВрдЧ
рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рд╣реИред рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рдХреЛ рдкрдврд╝реЗрдВ - рдФрд░ рдбреАрдмрдЧрд░ рдХрджрдо рдХреА рдорджрдж рд╕реЗ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдХреЛрдб рдкрдврд╝рддреЗ рд╕рдордп, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ VM рдЗрдЪреНрдЫрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдорд┐рд╕рдореИрдЪ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдХрд╛рд░рдг рд╕рдорд╕реНрдпрд╛ рд╣реБрдИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪреЗрдВред14. C ++ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐
рдпрд╣рд╛рдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдиреНрдирдд рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдХреЛрдб рдЖрдХрд╛рд░ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдиреБрднрд╛рдЧ рд╣реИредрдЪреВрдВрдХрд┐ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди C ++ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЬреЗрдирд░рд┐рдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрддрд░ рдХреЗ рдХрд░реАрдм рд╣реЛрддреА рд╣реИредрд╡рд┐рдЪрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЪрд░рдгреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкрддреЗ рдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ PC
ред рд╕рд╣рдордд рд╣реВрдБ, рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛?рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЪрд░рдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХрдИ рдЫреЛрдЯреЗ рдЪрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИред рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯ рдлреНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред 1
рдирд┐рд░реНрджреЗрд╢ рд╕рдВрдЦреНрдпрд╛ рдмрд┐рдЯ рдореЗрдВ рдорд╛рди рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреЛ рдХреЛрдб рдХреЗ рдЗрд╕ рдЦрдВрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред template <unsigned op> void ins(uint16_t instr) { uint16_t r0, r1, r2, imm5, imm_flag; uint16_t pc_plus_off, base_plus_off; uint16_t opbit = (1 << op); if (0x4EEE & opbit) { r0 = (instr >> 9) & 0x7; } if (0x12E3 & opbit) { r1 = (instr >> 6) & 0x7; } if (0x0022 & opbit) { r2 = instr & 0x7; imm_flag = (instr >> 5) & 0x1; imm5 = sign_extend((instr) & 0x1F, 5); } if (0x00C0 & opbit) {
static void (*op_table[16])(uint16_t) = { ins<0>, ins<1>, ins<2>, ins<3>, ins<4>, ins<5>, ins<6>, ins<7>, NULL, ins<9>, ins<10>, ins<11>, ins<12>, NULL, ins<14>, ins<15> };
рдиреЛрдЯ: рдореИрдВрдиреЗ рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд╕реНрдХрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдирдИрдПрд╕ рдПрдореБрд▓реЗрдЯрд░ рд╕реЗ рд╕реАрдЦрд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк рдЕрдиреБрдХрд░рдг рдпрд╛ рдПрдирдИрдПрд╕ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд╡реАрдбрд┐рдпреЛ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВредC ++ рдХреЗ рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдБ ред {Includes, 12} {Registers, 3} {Condition Flags, 3} {Opcodes, 3} {Memory Mapped Registers, 11} {TRAP Codes, 8} {Memory Storage, 3} {Register Storage, 3} {Functions, 12} int running = 1; {Instruction C++, 14} {Op Table, 14} int main(int argc, const char* argv[]) { {Load Arguments, 12} {Setup, 12} enum { PC_START = 0x3000 }; reg[R_PC] = PC_START; while (running) { uint16_t instr = mem_read(reg[R_PC]++); uint16_t op = instr >> 12; op_table[op](instr); } {Shutdown, 12} }