Skip to content

whatever125/stack_machine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

69 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

АрхитСктура ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Лабораторная Ρ€Π°Π±ΠΎΡ‚Π° β„–3

  • Колмаков Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ΠΎΠ²ΠΈΡ‡, P3231
  • asm | stack | neum | mc -> hw | instr | binary -> struct | stream | port | pstr | prob1 | cache
  • Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (Π±Π΅Π· услоТнСния)

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. Π―Π·Ρ‹ΠΊ программирования
  2. ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ памяти
  3. БистСма ΠΊΠΎΠΌΠ°Π½Π΄
  4. Вранслятор
  5. МодСль процСссора
  6. ВСстированиС
  7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
  8. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ тСстирования исходного ΠΊΠΎΠ΄Π°
  9. Бтатистика

Π―Π·Ρ‹ΠΊ программирования

Бинтаксис

<program> ::= <section_data>? <section_code>

<section_data> ::= "section data:" <comment>? "\n" <data_line>*
<data_line> ::= <variable> <comment>? "\n"

<variable> ::= <variable_name> ":" <variable_value>
<variable_name> ::= <letter_with_underscore> <letter_or_number_with_underscore>*
<variable_value> ::= <integer>
                   | <string>
                   | <buffer>

<section_code> ::= "section code:" <comment>? "\n" <code_line>*
<code_line> ::= (<label> | <command>) [comment] "\n"

<label> ::= <label_name> ":"
<label_name> ::= <letter_with_underscore> <letter_or_number_with_underscore>*

<command> ::= op0 | op1

<op0> ::= "nop"
        | "pop"
        | "swap"
        | "dup"
        | "over"
        | "inc"
        | "dec"
        | "add"
        | "sub"
        | "mul"
        | "div"
        | "mod"
        | "load"
        | "save"
        | "in"
        | "out"
        | "jmp"
        | "jz"
        | "call"
        | "ret"
        | "halt"

<op1> ::= "push" <integer>
        | "push" <variable_name>
        | "push" <label_name>

<lowercase_letter> ::= [a-z]
<uppercase_letter> ::= [A-Z]
<letter> ::= <lowercase_letter> | <uppercase_letter>
<letter_with_underscore> ::= <letter> | "_"
<letter_or_number_with_underscore> ::= <letter> | <number> | "_"

<number> ::= [0-9]
<integer> ::= "-"? <number>+
<positive_integer> ::= "0"* [1-9] <number>*

<single_quote> ::= "\'"
<double_quote> ::= "\""
<string> ::= <single_quote> [^\"\n]* <single_quote>
           | <double_quote> [^\'\n]* <double_quote>

<buffer> ::= "bf" positive_integer

<comment> ::= ";" [^\n]*

Π‘Π΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ°

  • Π’ ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ сСкция Π΄Π°Π½Π½Ρ‹Ρ… data, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (числа, строки, Π±ΡƒΡ„Π΅Ρ€Ρ‹). БСкция Π΄Π°Π½Π½Ρ‹Ρ… обязана Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ сСкции ΠΊΠΎΠ΄Π°. Випизация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… статичСская.
  • Названия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ рСгистру. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… нСдопустимо.
  • Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π±ΡƒΡ„Π΅Ρ€Π° производится Π² сСкции Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Π±ΡƒΡ„Π΅Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0.
    buffer:   bf    10    ; Π±ΡƒΡ„Π΅Ρ€ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 10
  • Π’ ΠΊΠΎΠ΄Π΅ обязана Π±Ρ‹Ρ‚ΡŒ сСкция code, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ инструкции ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ.
  • Бписок доступных инструкций ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² систСмС ΠΊΠΎΠΌΠ°Π½Π΄.
  • Код выполняСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ΄Π½Π° инструкция Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ.
  • ΠœΠ΅Ρ‚ΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС исходного ΠΊΠΎΠ΄Π°:
    start:
        push    1
    ΠœΠ΅Ρ‚ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Π΄ΠΎ, Ρ‚Π°ΠΊ ΠΈ послС опрСдСлСния Π² исходном ΠΊΠΎΠ΄Π΅. ΠœΠ΅Ρ‚ΠΊΠΈ Π½Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ рСгистру. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠΊ нСдопустимо. Названия ΠΌΠ΅Ρ‚ΠΎΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ названия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠœΠ΅Ρ‚ΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости.
  • Π’ ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ обязаны Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ инструкциСй RET. АргумСнты ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Data Stack. ΠŸΡ€ΠΈ этом послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² стСкС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ памяти

  • ΠŸΠ°ΠΌΡΡ‚ΡŒ соотвСтствуСт Ρ„ΠΎΠ½ НСймановской Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅.
  • Π Π°Π·ΠΌΠ΅Ρ€ машинного слова - 32 Π±ΠΈΡ‚Π°.
  • АдрСсация - Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ.
            Memory
+------------------------------+
| 00  : start address (n)      |
| 01  : integer value          |
|    ...                       |
| s+0 : string length          |
| s+1 : string value           |
|    ...                       |
| b+0 : buffer (0)             |
| b+1 : buffer (0)             |
|    ...                       |
| n   : program start          |
| n+1 : instruction            |
|    ...                       |
| 7 : PUSH sub                 |
| 8 : CALL                     |
|    ...                       |
| 25  : subprogram instruction |
| 26  : RET                    |
|    ...                       |
|  n  : HALT                   |
+------------------------------+

       Microprogram memory
+------------------------------+
| 00  : signals                |
| 01  : signals                |
|    ...                       |                
+------------------------------+
  • Π―Ρ‡Π΅ΠΉΠΊΠ° памяти 0 соотвСтствуСт адрСсу ΠΏΠ΅Ρ€Π²ΠΎΠΉ инструкции Π² сСкции code.

  • Если Π΅ΡΡ‚ΡŒ сСкция data, Ρ‚ΠΎ ΠΎΠ½Π° начинаСтся с ячСйки памяти 2. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

    • ЦСлочислСнныС - ΠΏΠΎΠ΄ Π½ΠΈΡ… отводится ΠΎΠ΄Π½Π° ячСйка памяти;
    • Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ - ΠΏΠΎΠ΄ Π½ΠΈΡ… отводится n + 1 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ячССк памяти, Π³Π΄Π΅ n - Π΄Π»ΠΈΠ½Π° строки (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ символ - n Π² Π½Π°Ρ‡Π°Π»Π΅ строки);
    • Π‘ΡƒΡ„Ρ„Π΅Ρ€Π½Ρ‹Π΅ - ΠΏΠΎΠ΄ Π½ΠΈΡ… отводится n ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ячССк памяти, Π³Π΄Π΅ n - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· запроса Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти (bf n);

    ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² памяти Π² Ρ‚Π°ΠΊΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² исходном ΠΊΠΎΠ΄Π΅ Π² сСкции .data`.

  • Π‘ ячСйки памяти n Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ инструкции, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ исходному ΠΊΠΎΠ΄Ρƒ, прописанному Π² сСкции code.

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ стСка

  • Π‘Ρ‚Π΅ΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ рСгистра, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка TOS ΠΈ Π²Ρ‹ΡΠΎΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… deque.
  • Π‘Ρ‚Π΅ΠΊ Π΄Π°Π½Π½Ρ‹Ρ… 32-разрядный ΠΈ позволяСт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π² ΠΎΠ΄Π½ΠΎΠΉ ячСйкС памяти.
  • Π‘Ρ‚Π΅ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ рСгистра, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹ΡΠΎΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΡƒΡŽ структуры Π΄Π°Π½Π½Ρ‹Ρ… deque.
  • Π‘Ρ‚Π΅ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° 32-разрядный ΠΈ позволяСт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² ΠΎΠ΄Π½ΠΎΠΉ ячСйкС памяти.

БистСма ΠΊΠΎΠΌΠ°Π½Π΄

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ процСссора

  • МашинноС слово - 32 Π±ΠΈΡ‚Π°, Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅. ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ адрСсация.
  • ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ рСгистры, нСдоступныС для программиста:
    • PC (program counter) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ;
    • MPC (micro program counter) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠΈΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ;
    • TOS (top of the stack) - Π²Π΅Ρ€ΡˆΠΈΠ½Π° стСка;
    • NOS (near of the stack) - Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт стСка;
    • AR (address register) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ячСйки памяти;
    • BR (buffer register) - рСгистр для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ хранСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· стСка.
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…:
    • АрифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· стСка;
    • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ стСком;
    • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°;
    • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния/записи с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.
  • Доступ ΠΊ памяти осущСствляСтся ΠΏΠΎ адрСсу ΠΈΠ· рСгистра AR. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π½Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΠΎ Π»ΠΈΠ±ΠΎ ΠΈΠ· PC, Π»ΠΈΠ±ΠΎ ΠΈΠ· TOS.
  • Π’Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π½Π΅ΡˆΠ½ΠΈΡ… устройств Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.
    • Устройства ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ ΠΈ доступны ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ ΠΏΠΎΡ€Ρ‚Π°.
    • АдрСсация Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ словом.
    • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ доступно ΠΎΠ΄Π½ΠΎ устройство с адрСсом 1;
    • Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ прСдставлСны Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ².
  • ΠŸΠΎΡ‚ΠΎΠΊ управлСния:
    • Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PC увСличиваСтся послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ инструкции:
      • ПослС инструкций Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° - Π½Π° 1;
      • ПослС инструкций с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ (PUSH) - Π½Π° 2.
    • БСзусловный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ - JMP, CALL, RET;
    • Условный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ - JZ, Ссли Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка ноль;
    • HАLT - остановка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Набор инструкций

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ стСком

  • PUSH integer - ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π΄Π°Π½Π½Ρ‹Ρ… цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅;
  • PUSH variable - ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π΄Π°Π½Π½Ρ‹Ρ… адрСс, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ начинаСтся пСрСмСнная;
  • PUSH label - ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π΄Π°Π½Π½Ρ‹Ρ… адрСс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΊΠ°;
  • POP - ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π΄Π°Π½Π½Ρ‹Ρ… [a] -> [];
  • SWAP - ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами Π΄Π²Π° значСния Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… [a, b] -> [b, a];
  • DUP - ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π΄Π°Π½Π½Ρ‹Ρ… [a] -> [a, a];
  • OVER - Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π½Π° стСкС Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‚ΠΎΡ€ΠΎΠΉ [a, b] -> [b, a, b].

АрифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

  • INC - ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ значСния Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° 1 [a] -> [a + 1];
  • DEC - ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ значСния Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° 1 [a] -> [a - 1];
  • ADD - сумма Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… [a, b] -> [b + a];
  • SUB - Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… (ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ вычитаСтся Π²Ρ‚ΠΎΡ€ΠΎΠ΅) [a, b] -> [b - a];
  • MUL - ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… [a, b] -> [b * a];
  • DIV - цСлочислСнноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… (Π²Π΅Ρ€Ρ…Π½Π΅Π΅ дСлится Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅) [a, b] -> [b // a];
  • MOD - остаток ΠΎΡ‚ дСлСния Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ… (Π²Π΅Ρ€Ρ…Π½Π΅Π΅ дСлится Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅) [a, b] -> [b % a].

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ

  • LOAD - Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ· памяти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ адрСсу с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка [address] -> [value_from_memory];
  • SAVE - Π²Π·ΡΡ‚ΡŒ адрСс с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ послС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π΄Π°Π½Π½Ρ‹Ρ… [value, address] -> [].

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

  • IN – ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· внСшнСго устройства ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ [port] -> [value];
  • OUT – ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π²ΠΎ внСшнСС устройство ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ [value, port] -> [].

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

  • NOP - Π½Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ;
  • JMP - ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ адрСсу ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π΄Π°Π½Π½Ρ‹Ρ… [address] -> [];
  • JZ - ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Ρ„Π»Π°Π³ zero (Z) Ρ€Π°Π²Π΅Π½ 1, ΠΈΠ½Π°Ρ‡Π΅ - ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎ порядку ΠΊΠΎΠΌΠ°Π½Π΄Π΅ [address] -> [];
  • CALL - Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ адрСсу ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка [address] -> [];
  • RET - Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ адрСс;
  • HALT - остановка Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

Бпособ кодирования инструкций

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ прСдставлСниС ΠΈ состоят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΎΠΏΠΊΠΎΠ΄Π° длиною 5 Π±ΠΈΡ‚. БоотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ инструкциСй ΠΈ Π΅Π΅ ΠΎΠΏΠΊΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ isa.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, СдинствСнный способ нСпосрСдствСнного Π²Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° стСк – опСрация PUSH <argument>. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ со стСком ΠΈ Π±Π΅Ρ€ΡƒΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ со стСка.

Π’Π°ΠΊΠΆΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ инструкции PUSH Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π»Π΅ΠΆΠΈΡ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ячСйкС памяти. НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Π° PUSH 42 Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСна Π² Π²ΠΈΠ΄Π΅:

n	0000 0000 0000 0000 0000 0000 0000 0001		push
n+1	0000 0000 0000 0000 0000 0000 0010 1010		42

По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ PC послС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ PUSH увСличиваСтся Π½Π° 2.

Вранслятор

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

usage: translator.py [-h] source_file target_file

ASM code translator

positional arguments:
  source_file  Source file name
  target_file  Target file name

options:
  -h, --help   show this help message and exit

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ translator.

Π­Ρ‚Π°ΠΏΡ‹ трансляции

Врансляция рСализуСтся Π² нСсколько этапов:

  1. ГСнСрация машинного ΠΊΠΎΠ΄Π° Π±Π΅Π· адрСсов ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, расчёт адрСсов ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…;
  2. ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° адрСсов ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² инструкции;
  3. ГСнСрация Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° <target_file>;
  4. ГСнСрация тСкстового Ρ„Π°ΠΉΠ»Π° <target_file>_com.txt с коммСнтариями.

МодСль процСссора

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

usage: main.py [-h] [-l LIMIT] [-c] [-d] code_file [input_file]

Stack processor simulation

positional arguments:
  code_file             Binary code file name
  input_file            Input file name (optional)

options:
  -h, --help            show this help message and exit
  -l LIMIT, --limit LIMIT
                        Tick limit (default - 200000)
  -c, --char            Char output (default - list[int])
  -d, --debug           Debug logging (default - info)

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ main.

DataPath

DataPath scheme

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ data_path.

  • Memory - однопортовая ΠΏΠ°ΠΌΡΡ‚ΡŒ;
  • ALU - АЛУ для выполнСния арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ;
  • Data Stack - стСк Π΄Π°Π½Π½Ρ‹Ρ…;
  • TOS - Π²Π΅Ρ€ΡˆΠΈΠ½Π° стСка;
  • Address Register - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ячСйки памяти;
  • Buffer Register - для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со стСком;
  • IO Controller - ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ сигналы приходят ΠΈΠ· памяти ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄, описаны Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ uarch.

  • DS_PUSH - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт стСка Π΄Π°Π½Π½Ρ‹Ρ…;
  • DS_POP - ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт ΠΈΠ· стСка Π΄Π°Π½Π½Ρ‹Ρ…;
  • LATCH_TOS - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка Π΄Π°Π½Π½Ρ‹Ρ…:
    • SEL_TOS_DS - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта стСка Π΄Π°Π½Π½Ρ‹Ρ…;
    • SEL_TOS_MEMORY - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· памяти;
    • SEL_TOS_INPUT - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· IO ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°;
    • SEL_TOS_ALU - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· АЛУ;
    • SEL_TOS_BR - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠ³ΠΎ рСгистра;
  • LATCH_AR - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² адрСсный рСгистр:
    • SEL_AR_TOS - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π΄Π°Π½Π½Ρ‹Ρ…;
    • SEL_AR_PC - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· счСтчика ΠΊΠΎΠΌΠ°Π½Π΄;
  • LATCH_BR - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта стСка Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ рСгистр;
  • ALU_SUM, ALU_SUB, ALU_MUL, ALU_DIV, ALU_MOD - Π²Ρ‹Π±ΠΎΡ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ арифмСтичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° АЛУ;
  • ALU_INC, ALU_DEC - модификация Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° АЛУ;
  • ALU_RIGHT_OP_NOS - ΠΏΠΎΠ΄Π°Ρ‡Π° Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта стСка Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΏΡ€Π°Π²Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ АЛУ;
  • ALU_RIGHT_OP_ZERO - ΠΏΠΎΠ΄Π°Ρ‡Π° нуля Π½Π° ΠΏΡ€Π°Π²Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ АЛУ;
  • OUT - ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт стСка Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° внСшнСС устройство ΠΏΠΎ ΠΏΠΎΡ€Ρ‚Ρƒ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π΄Π°Π½Π½Ρ‹Ρ…;
  • WRITE - Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ адрСсу ΠΈΠ· AR Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт стСка Π΄Π°Π½Π½Ρ‹Ρ….

Π€Π»Π°Π³ΠΈ:

  • zero (Z) - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π½Π° ноль.

ControlUnit

ControlUnit scheme

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ control_unit. ΠœΠΈΠΊΡ€ΠΎΠΊΠΎΠ΄ находится Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ uarch.

  • Program Counter - счСтчик ΠΊΠΎΠΌΠ°Π½Π΄;
  • Micro Program Counter - счСтчик ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄;
  • Micro Program - ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄;
  • Return Stack - стСк Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°;

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ сигналы приходят ΠΈΠ· памяти ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄, описаны Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ uarch.

  • RS_PUSH - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π² стСкС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠΎΠΌΠ°Π½Π΄;
  • RS_POP - ΡƒΠ±Ρ€Π°Ρ‚ΡŒ элСмСнт ΠΈΠ· стСка Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°;
  • LATCH_PC - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² счСтчик ΠΊΠΎΠΌΠ°Π½Π΄:
    • SEL_PC_NEXT - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠΎΠΌΠ°Π½Π΄;
    • SEL_PC_JMP - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π΄Π°Π½Π½Ρ‹Ρ…;
    • SEL_PC_JZ - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта стСка Π΄Π°Π½Π½Ρ‹Ρ… Ссли Ρ„Π»Π°Π³ zero (Z) Ρ€Π°Π²Π΅Π½ 1, ΠΈΠ½Π°Ρ‡Π΅ Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· счСтчика ΠΊΠΎΠΌΠ°Π½Π΄;
    • SEL_PC_RS - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°;
  • LATCH_MPC - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² счСтчик ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄:
    • SEL_MPC_ZERO - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ноль:
    • SEL_MPC_OPCODE - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· памяти ΠΏΠΎ адрСсу ΠΈΠ· AR;
    • SEL_MPC_NEXT - Π·Π°Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· счСтчика ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄;
  • HALT - остановка Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

ВСстированиС

  • ВСстированиС осущСствляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ golden test-ΠΎΠ².
  • Настройки golden тСстирования находятся Π² Ρ„Π°ΠΉΠ»Π΅ golden_test.py
  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ golden test-ΠΎΠ² Π»Π΅ΠΆΠΈΡ‚ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ golden

ВСстовоС ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅:

  • cat – повторяСт ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° Π½Π° Π²Ρ‹Π²ΠΎΠ΄;
  • hello_username – ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄ привСтствиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ;
  • hello_world – ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄ β€œHello, world!”;
  • math – арифмСтичСскиС дСйствия;
  • prob1 – сумма чисСл ΠΎΡ‚ 1 Π΄ΠΎ 1000, ΠΊΡ€Π°Ρ‚Π½Ρ‹Π΅ 3 Π»ΠΈΠ±ΠΎ 5.

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ тСсты:

poetry run pytest . -v

ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ golden-тСстов:

poetry run pytest . -v --update-goldens

CI

CI ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Github Actions настроСн Π² Ρ„Π°ΠΉΠ»Π΅ ci.yml:

name: stack-machine

on: [push]

jobs:
  golden:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          pip3 install poetry
          poetry install

      - name: Run tests and collect coverage
        run: |
          poetry run coverage run -m pytest .
          poetry run coverage report -m
        env:
          CI: true

  ruff:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          pip3 install poetry
          poetry install

      - name: Check code formatting with Ruff
        run: |
          poetry run ruff format --check . --exclude uarch.py

      - name: Run Ruff linters
        run: |
          poetry run ruff check .

  mypy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          pip3 install poetry
          poetry install

      - name: Check static typing with mypy
        run: |
          poetry run mypy .

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  • poetry - управлСния зависимостями Python;
  • coverage - Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° ΠΎΠ± ΡƒΡ€ΠΎΠ²Π½Π΅ покрытия исходного ΠΊΠΎΠ΄Π°;
  • pytest - ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для запуска тСстов;
  • ruff - Π»ΠΈΠ½Ρ‚Π΅Ρ€ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‚Π΅Ρ€;
  • mypy - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

ВСстовыС процСссы:

  • golden - запуск golden-тСстов
  • ruff - запуск Π»ΠΈΠ½Ρ‚Π΅Ρ€Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ форматирования ruff
  • mypy - запуск ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ mypy

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

Запуск транслятора:

python3 translator.py asm/hello_world.asm asm/hello_world.bin

Π’Ρ‹Π²ΠΎΠ΄ транслятора:

Translation successful
Source LoC: 43, Number of Instructions: 50

МнСмоники:

0	0000 0000 0000 0000 0000 0000 0001 0000 	start_address = 16
1	0000 0000 0000 0000 0000 0000 0000 0001 	port = 1
2	0000 0000 0000 0000 0000 0000 0000 1101 	hello : 13
3	0000 0000 0000 0000 0000 0000 0100 1000 	       `H`
4	0000 0000 0000 0000 0000 0000 0110 0101 	       `e`
5	0000 0000 0000 0000 0000 0000 0110 1100 	       `l`
6	0000 0000 0000 0000 0000 0000 0110 1100 	       `l`
7	0000 0000 0000 0000 0000 0000 0110 1111 	       `o`
8	0000 0000 0000 0000 0000 0000 0010 1100 	       `,`
9	0000 0000 0000 0000 0000 0000 0010 0000 	       ` `
10	0000 0000 0000 0000 0000 0000 0111 0111 	       `w`
11	0000 0000 0000 0000 0000 0000 0110 1111 	       `o`
12	0000 0000 0000 0000 0000 0000 0111 0010 	       `r`
13	0000 0000 0000 0000 0000 0000 0110 1100 	       `l`
14	0000 0000 0000 0000 0000 0000 0110 0100 	       `d`
15	0000 0000 0000 0000 0000 0000 0010 0001 	       `!`
16	0000 0000 0000 0000 0000 0000 0000 0001 	PUSH
17	0000 0000 0000 0000 0000 0000 0000 0010 	hello (2)
18	0000 0000 0000 0000 0000 0000 0000 1101 	LOAD
19	0000 0000 0000 0000 0000 0000 0000 0100 	DUP
20	0000 0000 0000 0000 0000 0000 0000 0001 	PUSH
21	0000 0000 0000 0000 0000 0000 0000 0001 	port (1)
22	0000 0000 0000 0000 0000 0000 0000 1101 	LOAD
23	0000 0000 0000 0000 0000 0000 0001 0000 	OUT
24	0000 0000 0000 0000 0000 0000 0000 0100 	DUP
25	0000 0000 0000 0000 0000 0000 0000 0001 	PUSH
26	0000 0000 0000 0000 0000 0000 0011 0001 	break (49)
27	0000 0000 0000 0000 0000 0000 0000 0011 	SWAP
28	0000 0000 0000 0000 0000 0000 0001 0010 	JZ
29	0000 0000 0000 0000 0000 0000 0000 0001 	PUSH
30	0000 0000 0000 0000 0000 0000 0000 0010 	hello (2)
31	0000 0000 0000 0000 0000 0000 0000 0110 	INC
32	0000 0000 0000 0000 0000 0000 0000 0100 	DUP
33	0000 0000 0000 0000 0000 0000 0000 1101 	LOAD
34	0000 0000 0000 0000 0000 0000 0000 0001 	PUSH
35	0000 0000 0000 0000 0000 0000 0000 0001 	port (1)
36	0000 0000 0000 0000 0000 0000 0000 1101 	LOAD
37	0000 0000 0000 0000 0000 0000 0001 0000 	OUT
38	0000 0000 0000 0000 0000 0000 0000 0011 	SWAP
39	0000 0000 0000 0000 0000 0000 0000 0111 	DEC
40	0000 0000 0000 0000 0000 0000 0000 0100 	DUP
41	0000 0000 0000 0000 0000 0000 0000 0001 	PUSH
42	0000 0000 0000 0000 0000 0000 0011 0001 	break (49)
43	0000 0000 0000 0000 0000 0000 0000 0011 	SWAP
44	0000 0000 0000 0000 0000 0000 0001 0010 	JZ
45	0000 0000 0000 0000 0000 0000 0000 0011 	SWAP
46	0000 0000 0000 0000 0000 0000 0000 0001 	PUSH
47	0000 0000 0000 0000 0000 0000 0001 1111 	loop (31)
48	0000 0000 0000 0000 0000 0000 0001 0001 	JMP
49	0000 0000 0000 0000 0000 0000 0001 1111 	HALT

Запуск процСссора:

python3 main.py asm/hello_world.bin -c

Π’Ρ‹Π²ΠΎΠ΄ процСссора (Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ уровня INFO):

Output: Hello, world!
Ticks: 948, Instructions: 204

Π§Π°ΡΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ (Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ уровня DEBUG):

DEBUG:root:
Tick: 0
MicroInstruction: LATCH_MPC, SEL_MPC_OPCODE
Instruction: PUSH 2
PC	MPC	AR	BR	TOS
16	1	16	0	0
DS: []
RS: []

DEBUG:root:
Tick: 1
MicroInstruction: DS_PUSH, LATCH_PC, SEL_PC_NEXT, LATCH_MPC, SEL_MPC_NEXT
PC	MPC	AR	BR	TOS
16	3	16	0	0
DS: []
RS: []

DEBUG:root:
Tick: 2
MicroInstruction: LATCH_AR, SEL_AR_PC, LATCH_MPC, SEL_MPC_NEXT
PC	MPC	AR	BR	TOS
17	4	16	0	0
DS: [0]
RS: []

DEBUG:root:
Tick: 3
MicroInstruction: LATCH_TOS, SEL_TOS_MEMORY, LATCH_PC, SEL_PC_NEXT, LATCH_MPC, SEL_MPC_ZERO
PC	MPC	AR	BR	TOS
17	5	17	0	0
DS: [0]
RS: []

DEBUG:root:
Tick: 4
MicroInstruction: LATCH_AR, SEL_AR_PC, LATCH_MPC, SEL_MPC_NEXT
PC	MPC	AR	BR	TOS
18	0	17	0	2
DS: [0]
RS: []

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ тСстирования исходного ΠΊΠΎΠ΄Π°

================================ test session starts ================================
platform darwin -- Python 3.12.3, pytest-8.2.1, pluggy-1.5.0 -- /Users/whatever125/De
sktop/Π°ΠΊ/lab3/.venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/whatever125/Desktop/Π°ΠΊ/lab3
configfile: pyproject.toml
plugins: golden-0.2.2
collected 5 items                                                                   

golden_test.py::test_translator_and_machine[golden/hello_username.yml] PASSED [ 20%]
golden_test.py::test_translator_and_machine[golden/prob1.yml] PASSED          [ 40%]
golden_test.py::test_translator_and_machine[golden/math.yml] PASSED           [ 60%]
golden_test.py::test_translator_and_machine[golden/cat.yml] PASSED            [ 80%]
golden_test.py::test_translator_and_machine[golden/hello_world.yml] PASSED    [100%]

================================= 5 passed in 0.42s =================================

Бтатистика

| ЀИО                           | Π°Π»Π³            | LoC | code инстр. | инстр. | Ρ‚Π°ΠΊΡ‚.  |
+-------------------------------+----------------+-----+-------------+--------+--------+
| Колмаков Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ΠΎΠ²ΠΈΡ‡ | cat            | 39  | 34          | 179    | 822    |
| Колмаков Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ΠΎΠ²ΠΈΡ‡ | hello_username | 100 | 158         | 686    | 3240   |
| Колмаков Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ΠΎΠ²ΠΈΡ‡ | hello_world    | 43  | 50          | 204    | 948    |
| Колмаков Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ΠΎΠ²ΠΈΡ‡ | math           | 19  | 16          | 9      | 37     |
| Колмаков Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ΠΎΠ²ΠΈΡ‡ | prob1          | 55  | 53          | 22523  | 108079 |

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published