рд╣рдо рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд▓рд┐рдЦрддреЗ рд╣реИрдВ

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

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

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

1. рд╕рд╛рдордЧреНрд░реА


  1. рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
  2. рдкрд░рд┐рдЪрдп
  3. рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдПрд▓рд╕реА -3
  4. рдЕрд╕реЗрдВрдмрд▓рд░ рдЙрджрд╛рд╣рд░рдг
  5. рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди
  6. рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
  7. рдирд┐рд░реНрджреЗрд╢ рдзреЛрдЦрд╛ рд╢реАрдЯ
  8. рдЗрдВрдЯрд░рдкреНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛
  9. рдмрд╛рдзрд┐рдд рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдзреЛрдЦрд╛ рд╢реАрдЯ
  10. рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
  11. рдореЗрдореЛрд░реА рдореИрдкрд┐рдВрдЧ рд░рдЬрд┐рд╕реНрдЯрд░
  12. рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реБрд╡рд┐рдзрд╛рдПрдБ
  13. рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк
  14. рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ 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 рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдмрд╣реБрдд рдХрдо! рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдпрд╣ рдореЗрдореЛрд░реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:

/* 65536 locations */ 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, /* program counter */ R_COND, R_COUNT }; 

рд╕реНрдореГрддрд┐ рдХреА рддрд░рд╣, рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ:

 uint16_t reg[R_COUNT]; 

рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ


рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдХрдорд╛рдВрдб рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореМрд▓рд┐рдХ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рдирдВрдмрд░ рдЬреЛрдбрд╝реЗрдВред рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдПрдХ рдУрдкрдХреЛрдб (рдСрдкрд░реЗрд╢рди рдХреЛрдб) рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдУрдкрдХреЛрдб рдПрдХ рдХрд╛рд░реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ "рдЬрд╛рдирддрд╛ рд╣реИ" рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реИред рдПрд▓рд╕реА -3 рдореЗрдВ 16 рдСрдкрдХреЛрдб рд╣реИрдВред рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗрд╡рд▓ рдЗрди рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреА рд▓рдВрдмрд╛рдИ 16 рдмрд┐рдЯреНрд╕ рд╣реИ, рдФрд░ рдмрд╛рдПрдВ 4 рдмрд┐рдЯреНрд╕ рдСрдкрд░реЗрд╢рди рдХреЛрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

 enum { OP_BR = 0, /* branch */ OP_ADD, /* add */ OP_LD, /* load */ OP_ST, /* store */ OP_JSR, /* jump register */ OP_AND, /* bitwise and */ OP_LDR, /* load register */ OP_STR, /* store register */ OP_RTI, /* unused */ OP_NOT, /* bitwise not */ OP_LDI, /* load indirect */ OP_STI, /* store indirect */ OP_JMP, /* jump */ OP_RES, /* reserved (unused) */ OP_LEA, /* load effective address */ OP_TRAP /* execute trap */ }; 

рдиреЛрдЯ: Intel x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЬреИрд╕реЗ ARM рдФрд░ LC-3 рдмрд╣реБрдд рдХрдо рд╣реИрдВред рдЫреЛрдЯреЗ рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рдХреЛ RISC рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрдбрд╝реЗ рдХреЛ CISC рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдбрд╝реЗ рдЕрдиреБрджреЗрд╢ рд╕реЗрдЯ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ ред CISC рдХрд╛ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХрдИ RISC рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, CISC рдкреНрд░реЛрд╕реЗрд╕рд░ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдФрд░ рдорд╣рдВрдЧреЗ рд╣реИрдВред рдпрд╣ рдФрд░ рдЕрдиреНрдп рд╡реНрдпрд╛рдкрд╛рд░-рдмрдВрдж "рдЗрд╖реНрдЯрддрдо" рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ ред

рд╣рд╛рд▓рдд рдЭрдВрдбреЗ


R_COND рд░рдЬрд┐рд╕реНрдЯрд░ рдЙрди рдХрдВрдбреАрд╢рди рдлреНрд▓реИрдЧ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ if (x > 0) { ... } ред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реНрдЯреЗрдЯрд╕ рдлреНрд▓реИрдЧ рд╣реЛрддреЗ рд╣реИрдВред LC-3 рдХреЗрд╡рд▓ рддреАрди рдХрдВрдбреАрд╢рди рдлрд╝реНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реА рдЧрдгрдирд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред

 enum { FL_POS = 1 << 0, /* P */ FL_ZRO = 1 << 1, /* Z */ FL_NEG = 1 << 2, /* N */ }; 

рдиреЛрдЯ: (рдЪрд░рд┐рддреНрд░ << рдХреЛ рд▓реЗрдлреНрдЯ рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред (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 рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЪрд╛рд╣реЗ рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд┐рддрдиреА рднреА рд╣реЛред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рд╡реАрдПрдо рднреА рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпрд╛ рд▓рд┐рдирдХреНрд╕ рдХреА рддрд░рд╣ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ!

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

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

рдкреНрд░рдХреНрд░рд┐рдпрд╛


рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рдЯреАрдХ рд╡рд┐рд╡рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  1. PC рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдкрддреЗ рдкрд░ рдореЗрдореЛрд░реА рд╕реЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
  2. PC рд░рдЬрд┐рд╕реНрдЯрд░ рдмрдврд╝рд╛рдПрдБред
  3. рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП opcode рджреЗрдЦреЗрдВред
  4. рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
  5. рдЪрд░рдг 1 рдкрд░ рд▓реМрдЯреЗрдВред

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

рд╣рдо рдореБрдЦреНрдп рдЪрдХреНрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 int main(int argc, const char* argv[]) { {Load Arguments, 12} {Setup, 12} /* set the PC to starting position */ /* 0x3000 is the default */ enum { PC_START = 0x3000 }; reg[R_PC] = PC_START; int running = 1; while (running) { /* FETCH */ 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) /* a 1 in the left-most bit indicates negative */ { reg[R_COND] = FL_NEG; } else { reg[R_COND] = FL_POS; } } 

рдЕрдм рд╣рдо ADD рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:

 { /* destination register (DR) */ uint16_t r0 = (instr >> 9) & 0x7; /* first operand (SR1) */ uint16_t r1 = (instr >> 6) & 0x7; /* whether we are in immediate mode */ 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 рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ:

 // the value of far_data is an address // of course far_data itself (the location in memory containing the address) has an address char* far_data = "apple"; // In memory it may be layed out like this: // Address Label Value // 0x123: far_data = 0x456 // ... // 0x456: string = 'a' // if PC was at 0x100 // LDI R0 0x023 // would load 'a' into R0 

рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, DR рдХреЛ рдорд╛рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЭрдВрдбреЗ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдкрд░рд┐рдгрд╛рдо рдХреЛрдб рдирдХрд╛рд░рд╛рддреНрдордХ, рд╢реВрдиреНрдп рдпрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред (рдкреГрд╖реНрда релрейреи)

рдпрд╣рд╛рдБ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ: ( mem_read рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА mem_read ):

 { /* destination register (DR) */ uint16_t r0 = (instr >> 9) & 0x7; /* PCoffset 9*/ uint16_t pc_offset = sign_extend(instr & 0x1ff, 9); /* add pc_offset to the current PC, look at that memory location to get the final address */ 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 рд╣реЛрддрд╛ рд╣реИред

 { /* Also handles 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; /* JSR */ } else { reg[R_PC] = reg[r1]; /* JSRR */ } 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, /* get character from keyboard */ TRAP_OUT = 0x21, /* output a character */ TRAP_PUTS = 0x22, /* output a word string */ TRAP_IN = 0x23, /* input a string */ TRAP_PUTSP = 0x24, /* output a byte string */ TRAP_HALT = 0x25 /* halt the program */ }; 

рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХреЛрдб рдХреНрдпреЛрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 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рдПрдХ рдЯрд░реНрдорд┐рдиреЗрдЯрд┐рдВрдЧ рдЬреАрд░реЛ (рдЗрд╕реА рддрд░рд╣ printfC) рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдкреГрд╖реНрда 543 рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ред

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

рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рд╕реЗ:

рдХрдВрд╕реЛрд▓ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ ASCII рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рд╡рд░реНрдг рд▓рдЧрд╛рддрд╛рд░ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐ рд╕реЗрд▓ рдПрдХ рд╡рд░реНрдг, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ R0ред рдЖрдЙрдЯрдкреБрдЯ рддрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореЗрдореЛрд░реА рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ x0000ред (рдкреГрд╖реНрда релрекрей)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣рд╛рдВ рд╡рд░реНрдг рдПрдХ рдмрд╛рдЗрдЯ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред LC-3 рдХреА рдореЗрдореЛрд░реА рд▓реЛрдХреЗрд╢рди 16 рдмрд┐рдЯреНрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреИрд░реЗрдХреНрдЯрд░ 16 рдмрд┐рдЯреНрд╕ рд╣реИред рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЛ рдПрдХ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 { /* one char per word */ uint16_t* c = memory + reg[R_R0]; while (*c) { putc((char)*c, stdout); ++c; } fflush(stdout); } 

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

9. рдмрд╛рдзрд┐рдд рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдзреЛрдЦрд╛ рд╢реАрдЯ


рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╢реЗрд╖ рд╡реНрдпрд╡рдзрд╛рди рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЪрд░рд┐рддреНрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


 /* read a single ASCII char */ reg[R_R0] = (uint16_t)getchar(); 

рдЪрд░рд┐рддреНрд░ рдЙрддреНрдкрд╛рджрди


 putc((char)reg[R_R0], stdout); fflush(stdout); 

рдЪрд░рд┐рддреНрд░ рдЗрдирдкреБрдЯ рдЕрдиреБрд░реЛрдз


 printf("Enter a character: "); reg[R_R0] = (uint16_t)getchar(); 

рд▓рд╛рдЗрди рдЖрдЙрдЯрдкреБрдЯ


 { /* one char per byte (two bytes per word) here we need to swap back to big endian format */ 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) { /* the origin tells us where in memory to place the image */ uint16_t origin; fread(&origin, sizeof(origin), 1, file); origin = swap16(origin); /* we know the maximum file size so we only need one fread */ uint16_t max_read = UINT16_MAX - origin; uint16_t* p = memory + origin; size_t read = fread(p, sizeof(uint16_t), max_read, file); /* swap to little endian */ 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, /* keyboard status */ MR_KBDR = 0xFE02 /* keyboard data */ }; 

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

 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) { /* show usage string */ 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 рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛ рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ!

  1. рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ ред
  2. 2048 рдпрд╛ рджреБрд╖реНрдЯ рдХрд╛ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред
  3. рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ obj рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдБ:
    lc3-vm path/to/2048.obj
  4. 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) { // Base + offset base_plus_off = reg[r1] + sign_extend(instr & 0x3f, 6); } if (0x4C0D & opbit) { // Indirect address pc_plus_off = reg[R_PC] + sign_extend(instr & 0x1ff, 9); } if (0x0001 & opbit) { // BR uint16_t cond = (instr >> 9) & 0x7; if (cond & reg[R_COND]) { reg[R_PC] = pc_plus_off; } } if (0x0002 & opbit) // ADD { if (imm_flag) { reg[r0] = reg[r1] + imm5; } else { reg[r0] = reg[r1] + reg[r2]; } } if (0x0020 & opbit) // AND { if (imm_flag) { reg[r0] = reg[r1] & imm5; } else { reg[r0] = reg[r1] & reg[r2]; } } if (0x0200 & opbit) { reg[r0] = ~reg[r1]; } // NOT if (0x1000 & opbit) { reg[R_PC] = reg[r1]; } // JMP if (0x0010 & opbit) // JSR { uint16_t long_flag = (instr >> 11) & 1; pc_plus_off = reg[R_PC] + sign_extend(instr & 0x7ff, 11); reg[R_R7] = reg[R_PC]; if (long_flag) { reg[R_PC] = pc_plus_off; } else { reg[R_PC] = reg[r1]; } } if (0x0004 & opbit) { reg[r0] = mem_read(pc_plus_off); } // LD if (0x0400 & opbit) { reg[r0] = mem_read(mem_read(pc_plus_off)); } // LDI if (0x0040 & opbit) { reg[r0] = mem_read(base_plus_off); } // LDR if (0x4000 & opbit) { reg[r0] = pc_plus_off; } // LEA if (0x0008 & opbit) { mem_write(pc_plus_off, reg[r0]); } // ST if (0x0800 & opbit) { mem_write(mem_read(pc_plus_off), reg[r0]); } // STI if (0x0080 & opbit) { mem_write(base_plus_off, reg[r0]); } // STR if (0x8000 & opbit) // TRAP { {TRAP, 8} } //if (0x0100 & opbit) { } // RTI if (0x4666 & opbit) { update_flags(r0); } } 

 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} } 

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


All Articles