modelmachine

Model machine emulator.


License
WTFPL
Install
pip install modelmachine==0.1.6

Documentation

modelmachine

Model machine emulator

Build Status

TODO

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ test.alu.swap
  • Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой
  • ΠŸΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎ mock Π² тСстах
  • ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
  • Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ
  • Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ howto

МодСльная машина

МодСльная машина - это чистая архитСктурная концСпция, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ функционирования Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… процСссоров. По своСй структурС ΠΎΠ½Π° Π±Π»ΠΈΠ·ΠΊΠ° ΠΊ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ поколСния. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΏΠΎ ссылкам Π²Π½ΠΈΠ·Ρƒ.

Quickstart

Установка ΠΏΠ°ΠΊΠ΅Ρ‚Π° происходит ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

# python3 -m pip install --upgrade modelmachine

ПослС этого Π²Π°ΠΌ становится доступна консольная ΠΊΠΎΠΌΠ°Π½Π΄Π° modelmachine. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ modelmachine test. Π‘ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° сСрия тСстов, всС тСсты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ успСхом.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π² ΠΏΠ°ΠΏΠΊΠ΅ , ΠΏΠΎ ΠΈΡ… ΠΎΠ±Ρ€Π°Π·Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΌΠΎΠ΄Π΅Π»ΡŒΠ½Ρ‹Ρ… машин. Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ дСлаСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ modelmachine run program.mmach

Π’Π°ΠΊΠΆΠ΅ доступна пошаговая ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ modelmachine debug program.mmach

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ассСмблСра модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹ (mmasm) Π² Π΅Π΅ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

$ modelmachine asmg source.mmasm result.mmach

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

mm3

[config]
input = 0x100,0x101
output = 0x103

[code]
; x = ((a * -21) % 50 - b) ** 2 == 178929
03 0100 0005 0103 ; x := a * -21
04 0103 0006 0102 ; [0102] := x / 50, x := x % 50
02 0103 0101 0103 ; x := x - b
03 0103 0103 0103 ; x := x * x
99 0000 0000 0000 ; halt
; ---------------------
FFFFFFFFFFFFEB ; -21
00000000000032 ; 50

[input]
-123 456
  • ВсС, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ послС символа ; - ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ.
  • ΠŸΠ΅Ρ€Π²Π°Ρ строчка - ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. Бписок ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ смотри Π½ΠΈΠΆΠ΅.
  • ПослС этого Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ΄Ρ‚ΠΈ сСкция config, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ ячСйки памяти, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄.
  • ПослС этого сСкция ΠΊΠΎΠ΄Π°, содСрТащая Π½Π°Π±ΠΎΡ€ 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… чисСл, записываСмых Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ машинного слова нСльзя. РСкомСндуСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ слову Π² строкС, ΠΏΠΎ ТСланию разбивая разряды Π½Π° части ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ.
  • ΠŸΡƒΡΡ‚Ρ‹Π΅ строки ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.
  • ПослС этого ΠΈΠ΄Π΅Ρ‚ сСкция Π²Π²ΠΎΠ΄Π° - нСсколько чисСл, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами. Π˜Ρ… число Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с числом ячССк для Π²Π²ΠΎΠ΄Π° Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ input Π² сСкции config.
  • Если сСкция Π²Π²ΠΎΠ΄Π° отсутствуСт ΠΈΠ»ΠΈ Ссли ΠΎΠ½Π° пустая, Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ со стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° Π΄ΠΎ исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
  • По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° экран Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Ρ‹ дСсятичныС числа со Π·Π½Π°ΠΊΠΎΠΌ, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π² ячСйках, пСрСчислСнных Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ output Π² сСкции config.

Π―Π·Ρ‹ΠΊ ассСмблСра

Для ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°ΠΈΠ΅ΠΉ адрСсов поддСрТиваСтся ассСмблСр. АссСмблСр нСчувствитСлСн ΠΊ рСгистру. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ компилятору ΠΏΡ€Π΅Π΄Π²ΠΎΡ€ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. ДоступныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ компилятора:

  • .config число - дальнСйшиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ начиная с адрСса число.
  • .code - дальшС ΠΈΠ΄Π΅Ρ‚ исходный ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ начиная с адрСса 0x00.
  • .word список_чисСл - Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ список чисСл Π² памяти ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ число Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ячССк.
  • .dump имя_ΠΌΠ΅Ρ‚ΠΊΠΈ - ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вывСсти содСрТимоС памяти ΠΏΠΎ адрСсу имя_ΠΌΠ΅Ρ‚ΠΊΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ содСрТимоС Π΄Π²ΡƒΡ… ячССк ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ число. Для Π²Ρ‹Π²ΠΎΠ΄Π° массива фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ .dump имя_ΠΌΠ΅Ρ‚ΠΊΠΈ(Ρ€Π°Π·ΠΌΠ΅Ρ€). Π’Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ. НапримСр: .dump array(5), sum

ΠšΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄ Ρ‚Π΅ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΊΠΎΠ΄ΠΎΠ² mmm. Имя ΠΌΠ΅Ρ‚ΠΊΠΈ - ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ английских Π±ΡƒΠΊΠ², Ρ†ΠΈΡ„Ρ€ ΠΈ Π·Π½Π°ΠΊΠ° _, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ - Π½Π΅ Ρ†ΠΈΡ„Ρ€Π°. АдрСс прСдставляСт собой Π»ΠΈΠ±ΠΎ имя ΠΌΠ΅Ρ‚ΠΊΠΈ, Π»ΠΈΠ±ΠΎ строку Π²ΠΈΠ΄Π° имя_ΠΌΠ΅Ρ‚ΠΊΠΈ(имя_рСгистра), Π³Π΄Π΅ имя_рСгистра - ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ R0-RF.

Π’Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ поддСрТиваСтся.

.config 0x100
sum: .word 0
array: .word -1, 2, 3, 4, 5
zero: .word 0
size_word: .word 2
size_array: .word 10
.dump array(5), sum
.code
load R2, size_word
load RF, size_array
load R5, zero
rsub R6, R6
rpt: add R5, array(R6)
radd R6, R2
rcomp R6, RF
jneq rpt
store R5, sum
halt

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство

Данная рСализация модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹ состоит ΠΈΠ· классов, Ρ€Π°Π·Π±ΠΈΡ‚Ρ‹Ρ… Π½Π° Ρ„Π°ΠΉΠ»Ρ‹-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ:

  • memory.py - ΠΏΠ°ΠΌΡΡ‚ΡŒ; дСлится Π½Π° Π΄Π²Π° класса: рСгистровая ΠΈ опСративная; опСративная дСлится Π½Π° little-endian ΠΈ big-endian
  • numeric.py - цСлочислСнная Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ° с фиксированным числом Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°ΠΊΠΎΠ²
  • alu.py - Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΎ-логичСскоС устройство, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‡Π΅Ρ‚ΠΊΠΎ спСциализированными рСгистрами: R1, R2, S, FLAGS ΠΈ PC.
  • cu.py - ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ устройство, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π΅ считываниС ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ· памяти ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΎ-логичСском устройствС
  • io.py - устройство Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°
  • cpu.py - Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ объСдинСниС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… устройств Π² Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅
  • asm.py - ассСмблСр для ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ адрСсов

Π—Π΄Π΅ΡΡŒ Π΄Π°Π½ΠΎ повСрхностноС описаниС ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π—Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ ΠΈΡ… исходным ΠΊΠΎΠ΄Π°ΠΌ.

memory.py

AbstractMemory - класс абстрактной памяти, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ интСрфСйс для Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ связи частСй ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: fetch ΠΈ put, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π° Π²Ρ…ΠΎΠ΄ адрСс Π² памяти ΠΈ количСство Π±ΠΈΡ‚ΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, количСство Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ячСйки (слова). Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ рСкомСндуСтся ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅.

RandomAccessMemory - класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒ прямого доступа. ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ указываСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ машинного слова ΠΈ количСство этих слов. Если is_protected=True, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ считывания ΠΈΠ· Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ячСйки Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΈΠ½Π°Ρ‡Π΅, ΠΌΠ΅Ρ‚ΠΎΠ΄ fetch Π²Π΅Ρ€Π½Π΅Ρ‚ Π½ΡƒΠ»ΡŒ.

RegisterMemory - класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠœΠ΅Ρ‚ΠΎΠ΄ add_register добавляСт рСгистр ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ»ΠΈ провСряСт, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ рСгистр ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€.

numeric.py

Класс Integer Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ фиксированной Π΄Π»ΠΈΠ½Ρ‹. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: +, -, *, /, %, ==, !=. Плюс ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ get_value ΠΈ get_data. ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠΈ производится Π² сторону нуля.

alu.py

АрифмСтико-логичСскоС устройство Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‡Π΅Ρ‚ΠΊΠΎ спСциализированными рСгистрами:

  • R1, R2, S для арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.
  • FLAGS для хранСния Ρ„Π»Π°Π³ΠΎΠ² состояния.
  • PC Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для пСрСсылки Ρ‚ΡƒΠ΄Π° адрСса ΠΈΠ· рСгистра R1 ΠΏΡ€ΠΈ условных ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°Ρ….

Π‘Ρ…Π΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹:

  • АрифмСтичСскиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: add, sub, smul, sdiv, umul, udiv, sdivmod, udivmod. Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ divmod арифмСтичСскиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: S := R1 op R2. Плюс Π² зависимости ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выставляСтся рСгистр FLAGS - комбинация Ρ„Π»Π°Π³ΠΎΠ² CF, OF, SF ΠΈ ZF.
  • add ΠΈ sub - слоТСниС ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ соотвСтсвСнно.
  • smul ΠΈ sdiv - Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ соотвСтсвСнно.
  • umul ΠΈ udiv - Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ соотвСтсвСнно.
  • sdivmod ΠΈ udivmod - Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ соотвСтствСнно Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с остатком. S := R1 / R2; R1 := R1 % R2.
  • Команда пСрСсылки move: S := R1.
  • ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ бСзусловного ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° jump ΠΈ условного ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° cond_jump Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎ схСмС PC := R1, Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ cond_jump зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹.
  • Команда останова halt просто выставляСт Ρ„Π»Π°Π³ остановки HALT Π² рСгистрС Ρ„Π»Π°Π³ΠΎΠ²

cu.py

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ устройство.

AbstractControlUnit

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ устройство Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ схСмС:

  1. fetch_and_decode - Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти с адрСсом записанным Π² рСгистрС PC загруТаСтся Π² рСгистр RI, Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ извлСкаСтся ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ адрСса ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ², Π·Π°Ρ‚Π΅ΠΌ счСтчик PC увСличиваСтся Π½Π° Π΄Π»ΠΈΠ½Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ считанной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.
  2. load - Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ считанным адрСсам Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π² рСгистры процСссора R1 ΠΈ R2
  3. execute - Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΎ-логичСском устройствС запускаСтся Ρ‚Π° ΠΈΠ»ΠΈ иная схСма вычислСний.
  4. write_back - Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСний записываСтся ΠΊΡƒΠ΄Π° полагаСтся (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· адрСсов считанных Π² Π½Π°Ρ‡Π°Π»Π΅).

ВсС эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² AbstractControlUnit. Π’Π°ΠΊΠΆΠ΅ Π² Π½Π΅ΠΌ написаны ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ интСрфСйсом устройства управлСния:

  • step - ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ шаг, описанный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π²Ρ‹ΡˆΠ΅.
  • get_status - Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ статус процСссора (выполняСтся/остановлСн). ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° производится ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ останова halt.
  • run - Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ шаг Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, ΠΏΠΎΠΊΠ° процСссор Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ остановлСн.

Π”Π°Π»Π΅Π΅, наслСдники AbstractControlUnit ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 4 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

io.py

Устройство Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

  • ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ устанавливаСтся адрСс с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ load_source Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡˆΠ΅ΡΠ½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½Ρ‹Ρ… слов ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ адрСсу.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ load_data Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ (ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΈΠ· строки чисСл) ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ адрСсам.
  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ get_int ΠΈ put_int Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с содСрТимым ΠΎΠ΄Π½ΠΎΠ³ΠΎ слова. Π Π°Π·ΠΌΠ΅Ρ€ слова устанавливаСтся ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

cpu.py

Ѐинальная сборка всСх составных устройств Π² Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅.

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ доступ ΠΊ составным устройствам. НапримСр, доступ ΠΊ устройству Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· cpu.io_unit, ΠΊ рСгистрам Ρ‡Π΅Ρ€Π΅Π· cpu.registers ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.
  • load_program - Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.
  • print_result - ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
  • run_file - Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°, исполнСниС ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹

Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ?

  1. Π’Ρ‹ΠΏΠΈΡΠ°Ρ‚ΡŒ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ устройстройства ΠΈ ΠΈΡ… ΠΊΠΎΠ΄Ρ‹.
  2. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π½ΠΈΠΆΠ΅ ΠΈ описаниС Π΅Ρ‰Π΅ Π½ΠΈΠΆΠ΅.
  3. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс устройства управлСния Π½Π° основС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ.
  4. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс CPU ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ это устройство управлСния, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ этот класс Π² список CPU_LIST Π² Ρ„Π°ΠΉΠ»Π΅ cpu.py.
  5. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ тСсты для ΠΎΠ±ΠΎΠΈΡ… этих классов Π² Ρ„Π°ΠΉΠ»Ρ‹ tests/test_cu.py ΠΈ tests/test_cpu.py.
  6. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π² ΠΏΠ°ΠΏΠΊΡƒ samples.
  7. ΠŸΡ€ΠΈΡΠ»Π°Ρ‚ΡŒ pull request.

Π’Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠΌΠ°Π½Π΄ ΠΌΠΎΠ΄Π΅Π»ΡŒΠ½Ρ‹Ρ… машин

OPCODE mm-3 mm-2 mm-v mm-1 mm-m
0x00 move move move load load
0x01 add add add add add
0x02 sub sub sub sub sub
0x03 smul smul smul smul smul
0x04 sdiv sdiv sdiv sdiv sdiv
0x05 comp comp comp comp
0x13 umul umul umul umul umul
0x14 udiv udiv udiv udiv udiv
0x10 store store
0x20 swap move
0x21 radd
0x22 rsub
0x23 rsmul
0x24 rsdiv
0x25 rcomp
0x33 rumul
0x34 rudiv
0x80 jump jump jump jump jump
0x81 jeq jeq jeq jeq jeq
0x82 jneq jneq jneq jneq jneq
0x83 sjl sjl sjl sjl sjl
0x84 sjgeq sjgeq sjneq sjgeq sjgeq
0x85 sjleq sjleq sjleq sjleq sjleq
0x86 sjg sjg sjg sjg sjg
0x93 ujl ujl ujl ujl ujl
0x94 ujgeq ujgeq ujgeq ujgeq ujgeq
0x95 ujleq ujleq ujleq ujleq ujleq
0x96 ujg ujg ujg ujg ujg
0x99 halt halt halt halt halt

На самом Π΄Π΅Π»Π΅ опСрация div запускаСт Π² АЛУ схСму divmod.

НиТС Π΄Π°Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠΌΠ°Π½Π΄ условных ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ². ΠžΡ‚ΠΊΡƒΠ΄Π° бСрутся ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ для сравнСния зависит ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ смотри [1].

ΠœΠ½Π΅ΠΌΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ УсловиС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ°/описаниС
jeq == jump if equal
jneq != jump if not equal
sjl < s signed jump if less
sjgeq >= s signed jump if greater or equal
sjleq <= s signed jump if less or equal
sjg > s signed jump if greater
ujl < u unsigned jump if less
ujgeq >= u unsigned jump if greater or equal
ujleq <= u unsigned jump if less or equal
ujg > u unsigned jump if greater

mm-3

АрхитСктура трСхадрСсной модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

  • Π Π°Π·ΠΌΠ΅Ρ€ ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти: 7 Π±Π°ΠΉΡ‚.
  • Π Π°Π·ΠΌΠ΅Ρ€ адрСса: 2 Π±Π°ΠΉΡ‚Π°.
  • АрифмСтичСскиС вычислСния производятся с ΠΎΠ΄Π½ΠΎΠΉ ячСйкой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.
  • Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ помСщаСтся Π² ΠΎΠ΄Π½Ρƒ ячСйку ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти КОП А1 А2 А3.
  • РСгистры: S, R1, R2, FLAGS, PC, RI, ADDR.

НазначСниС рСгистров:

  • S - рСгистр сумматор, Π² Π½Π΅Π³ΠΎ записываСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ арифмСтичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
  • R1, R2 - рСгистры ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.
  • FLAGS - рСгистр Ρ„Π»Π°Π³ΠΎΠ².
  • PC - рСгистр ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ инструкции.
  • RI - рСгистр для хранСния инструкции.
  • ADDR - рСгистр для хранСния адрСса для инструкции ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°.

ДСйствия процСссора для арифмСтичСских инструкций (add, sub, smul, sdiv, umul, udiv) КОП A1 A2 A3:

  1. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ содСрТимоС ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти с адрСсом А1 Π² рСгистр R1 (R1 := [A1]).
  2. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ содСрТимоС ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти с адрСсом А2 Π² рСгистр R2 (R2 := [A2]).
  3. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² АЛУ схСму, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡƒΡŽ КОП.
  4. Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ· рСгистра S Π² ячСйку ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти с адрСсом А3. Если выполняСтся опСрация дСлСния, Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: частноС – Π² ячСйку с адрСсом А3, остаток – Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ячСйку, ΠΏΠΎ адрСсу (А3+1) mod 16^4.

  • jump A1 A2 A3: PC := A3
  • УсловныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹: ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ R1 ΠΈ R2, Π² зависимости ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° происходит PC := A3.
  • Команда пСрСсылки move: [A3] := R1.

mm-2

АрхитСктура двухадрСсной модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

  • Π Π°Π·ΠΌΠ΅Ρ€ ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти: 5 Π±Π°ΠΉΡ‚.
  • Π Π°Π·ΠΌΠ΅Ρ€ адрСса: 2 Π±Π°ΠΉΡ‚Π°.
  • АрифмСтичСскиС вычислСния производятся с ΠΎΠ΄Π½ΠΎΠΉ ячСйкой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.
  • Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ помСщаСтся Π² ΠΎΠ΄Π½Ρƒ ячСйку ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти КОП А1 А2.
  • РСгистры: R1, R2, FLAGS, PC, RI, ADDR.

ДСйствия для арифмСтичСских ΠΊΠΎΠΌΠ°Π½Π΄ add, sub, smul, sdiv, umul, udiv:

  1. R1 := [A1], R2 := [A2]
  2. R1 := R1 op R2
  3. [A1] := R1

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сравнСния cmp:

  1. R1 := [A1], R2 := [A2]
  2. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² АЛУ схСму sub, Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ рСгистр FLAGS

  • jump A1 A2: PC := A2
  • УсловныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ исходя ΠΈΠ· рСгистра FLAGS
  • move A1 A2: [A1] := [A2]
  • Команда останова halt Π²Π·Π²ΠΎΠ΄ΠΈΡ‚ Ρ„Π»Π°Π³ HALT Π² рСгистрС FLAGS

mm-v

АрхитСктура модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ (variable) Ρ„Π°Ρ€ΠΌΠ°Ρ‚ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄.

  • Π Π°Π·ΠΌΠ΅Ρ€ ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти: 1 Π±Π°ΠΉΡ‚.
  • Π Π°Π·ΠΌΠ΅Ρ€ адрСса: 2 Π±Π°ΠΉΡ‚Π°.
  • АрифмСтичСскиС вычислСния производятся со словами Π² 5 ячССк ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.
  • Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π°Π·Π½ΠΎΠ΅ количСство ячССк Π² зависимости ΠΎΡ‚ выполняСмой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
  • РСгистры: R1, R2, FLAGS, PC, RI, ADDR.

Π’Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ΄ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄:

Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ МнСмоник Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π”Π»ΠΈΠ½Π° (Π² Π±Π°ΠΉΡ‚Π°Ρ…)
0x00 move move A1 A2 5
0x01 add add A1 A2 5
0x02 sub sub A1 A2 5
0x03 smul smul A1 A2 5
0x04 sdiv sdiv A1 A2 5
0x05 comp comp A1 A2 5
0x13 umul umul A1 A2 5
0x14 udiv udiv A1 A2 5
0x80 jump jump A1 3
0x81 jeq jeq A1 3
0x82 jneq jneq A1 3
0x83 sjl sjl A1 3
0x84 sjgeq sjgeq A1 3
0x85 sjleq sjleq A1 3
0x86 sjg sjg A1 3
0x93 ujl ujl A1 3
0x94 ujgeq ujgeq A1 3
0x95 ujleq ujleq A1 3
0x96 ujg ujg A1 3
0x99 halt halt 1

ДСйствия для арифмСтичСских ΠΊΠΎΠΌΠ°Π½Π΄ add, sub, smul, sdiv, umul, udiv:

  1. R1 := [A1], R2 := [A2]
  2. R1 := R1 op R2
  3. [A1] := S

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сравнСния cmp:

  1. R1 := [A1], R2 := [A2]
  2. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² АЛУ схСму sub, Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ рСгистр FLAGS

  • jump A1: PC := A1
  • УсловныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ исходя ΠΈΠ· рСгистра FLAGS
  • move A1 A2: [A1] := [A2]
  • Команда останова halt Π²Π·Π²ΠΎΠ΄ΠΈΡ‚ Ρ„Π»Π°Π³ HALT Π² рСгистрС FLAGS

mm-1

АрхитСктура одноадрСсной модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

  • Π Π°Π·ΠΌΠ΅Ρ€ ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти: 3 Π±Π°ΠΉΡ‚Π°.
  • Π Π°Π·ΠΌΠ΅Ρ€ адрСса: 2 Π±Π°ΠΉΡ‚Π°.
  • АрифмСтичСскиС вычислСния производятся с ΠΎΠ΄Π½ΠΎΠΉ ячСйкой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.
  • Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ помСщаСтся Π² ΠΎΠ΄Π½Ρƒ ячСйку ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти КОП А.
  • РСгистры: S, R, S1, FLAGS, PC, RI.

РСгистры S ΠΈ S1 хранят ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ постоянно, Π° Π½Π΅ Π·Π°Ρ‚ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅. Π’ рСгистр R закгруТаСтся ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ для арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ДСйствия для арифмСтичСских ΠΊΠΎΠΌΠ°Π½Π΄ (ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Π΅Π»Π΅Π½ΠΈΠ΅) add, sub, smul, umul:

  1. R := [A]
  2. S := S op R

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄ дСлСния sdivmod, udivmod:

  1. R := [A]
  2. S := S / R; S1 := S % R

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сравнСния cmp:

  1. R := [A]
  2. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² АЛУ схСму sub, Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ рСгистр FLAGS

  • jump A: PC := A
  • УсловныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ исходя ΠΈΠ· рСгистра FLAGS
  • load A: S := [A]
  • store A: [A] := S
  • swap: S, S1 := S1, S
  • Команда останова halt Π²Π·Π²ΠΎΠ΄ΠΈΡ‚ Ρ„Π»Π°Π³ HALT Π² рСгистрС FLAGS

mm-m

АрхитСктура модСльной ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ адрСсов (modification).

  • Π Π°Π·ΠΌΠ΅Ρ€ ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти: 2 Π±Π°ΠΉΡ‚Π°.
  • Π Π°Π·ΠΌΠ΅Ρ€ адрСса: 2 Π±Π°ΠΉΡ‚Π°.
  • АрифмСтичСскиС вычислСния производятся со словом Π² 4 Π±Π°ΠΉΡ‚Π°.
  • Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π°Π·Π½ΠΎΠ΅ количСство ячССк Π² зависимости ΠΎΡ‚ выполняСмой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. АрифмСтичСскиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹ рСгистр-рСгистр ΠΈ рСгистр-ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ рСгистр-рСгистр ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ КОП RA1 RA2 ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ 2 Π±Π°ΠΉΡ‚Π°. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ рСгистр-ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ КОП R M A ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ 4 Π±Π°ΠΉΡ‚Π°. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ КОП 0 0 A ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ 4 Π±Π°ΠΉΡ‚Π°.
  • РСгистры: R0-RF, S, RZ, FLAGS, PC, RI.

ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ этой ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… - Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ адрСсуСмых рСгистров ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния R0-RF, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для арифмСтичСских вычислСний ΠΈ адрСсации памяти. S, RZ - нСадрСсуСмыС рСгистры для Ρ€Π°Π±ΠΎΡ‚Ρ‹ АЛУ.

Π’Π°ΠΊΠΆΠ΅ адрСсация Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ производится Ρ‚Π°ΠΊΠΈΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ:

  1. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ содСрТимоС адрСсуСмого рСгистра с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ M (ΠΎΡ‚ 0x0 Π΄ΠΎ 0xF): [M]. Если Π½ΠΎΠΌΠ΅Ρ€ рСгистра M Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ [M] Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ Π²Π½Π΅ зависимости ΠΎΡ‚ содСрТимого рСгистра R0.
  2. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ Π½Π΅ΠΌΡƒ адрСс A (ΠΎΡ‚ 0x0000 Π΄ΠΎ 0xFFFF): [M] + A.
  3. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ остаток ΠΎΡ‚ дСлСния этого адрСса Π½Π° 2^16: ([M] + A) % 2^16.
  4. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ ΠΈΠ· ΠžΠ—Π£ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ адрСсу: [[M] + A].

Π’Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ΄ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄:

Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ МнСмоник Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π”Π»ΠΈΠ½Π° (Π² Π±Π°ΠΉΡ‚Π°Ρ…)
0x00 load load R M A 4
0x01 add add R M A 4
0x02 sub sub R M A 4
0x03 smul smul R M A 4
0x04 sdiv sdiv R M A 4
0x05 comp comp R M A 4
0x11 addr addr R M A 4
0x13 umul umul R M A 4
0x14 udiv udiv R M A 4
0x10 store store R M A 4
0x20 rmove rmove RX RY 2
0x21 radd radd RX RY 2
0x22 rsub rsub RX RY 2
0x23 rsmul rsmul RX RY 2
0x24 rsdiv rsdiv RX RY 2
0x25 rcomp rcomp RX RY 2
0x33 rumul rumul RX RY 2
0x34 rudiv rudiv RX RY 2
0x80 jump jump 0 M A 4
0x81 jeq jeq 0 M A 4
0x82 jneq jneq 0 M A 4
0x83 sjl sjl 0 M A 4
0x84 sjgeq sjgeq 0 M A 4
0x85 sjleq sjleq 0 M A 4
0x86 sjg sjg 0 M A 4
0x93 ujl ujl 0 M A 4
0x94 ujgeq ujgeq 0 M A 4
0x95 ujleq ujleq 0 M A 4
0x96 ujg ujg 0 M A 4
0x99 halt halt 00 2

ДСйствия для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ адрСса Π² рСгистр addr R M A:

  1. S := [M] + A
  2. R := S

ДСйствия для арифмСтичСских ΠΊΠΎΠΌΠ°Π½Π΄ рСгистр-ΠΏΠ°ΠΌΡΡ‚ΡŒ (ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Π΅Π»Π΅Π½ΠΈΠ΅) add, sub, smul, umul (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ op R M A):

  1. S, RZ := R, [[M] + A]
  2. S := S op RZ
  3. R := S

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄ дСлСния рСгистр-ΠΏΠ°ΠΌΡΡ‚ΡŒ sdivmod ΠΈ udivmod (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ op R M A, R_next - рСгистр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° рСгистром R):

  1. S, RZ := S, [[M] + A]
  2. S, RZ := S / RZ, S % RZ
  3. R, R_next := S, RZ

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сравнСния comp R M A:

  1. S, RZ := S, [[M] + A]
  2. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² АЛУ схСму sub S RZ, Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ рСгистр FLAGS

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ load R M A:

  1. R := [[M] + A]

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ store R M A:

  1. [[M] + A] := R

ДСйствия для арифмСтичСских ΠΊΠΎΠΌΠ°Π½Π΄ рСгистр-рСгистр (ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Π΅Π»Π΅Π½ΠΈΠ΅) radd, rsub, rsmul, rumul (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ op RX RY):

  1. S, RZ := RX, RY
  2. S := S op RZ
  3. RX := S

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄ дСлСния рСгистр-рСгистр rsdiv ΠΈ rudiv (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ - op RX RY; RX_next - рСгистр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° рСгистром RX, Ссли RX = RF, Ρ‚ΠΎ RX_next = R0):

  1. S, RZ := RX, RY
  2. S, RZ := S / RZ, S % RZ
  3. RX, RX_next := S, RZ

ДСйствия для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сравнСния rcomp RX RY:

  1. S, RZ := RX, RY
  2. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² АЛУ схСму sub S RZ, Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ рСгистр FLAGS

  • jump 00 A: PC := A
  • УсловныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ исходя ΠΈΠ· рСгистра FLAGS
  • Команда останова halt Π²Π·Π²ΠΎΠ΄ΠΈΡ‚ Ρ„Π»Π°Π³ HALT Π² рСгистрС FLAGS

References

  1. E. А. Π‘ΠΎΡ€Π΄Π°Ρ‡Π΅Π½ΠΊΠΎΠ²Π° - "ΠœΠΎΠ΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π­Π’Πœ" http://al.cs.msu.su/files/ModComp.pdf
  2. Π•. А. Π‘ΠΎΡ€Π΄Π°Ρ‡Π΅Π½ΠΊΠΎΠ²Π° - "АрхитСктура Π­Π’Πœ. Π£Ρ‡Π΅Π±Π½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ пособиС" http://al.cs.msu.su/files/bordachenkova.architecture.model.machines.2010.doc
  3. Π’. Π“. Π‘Π°ΡƒΠ»Π° - "Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ Π­Π’Πœ ΠΈ систСмы программирования" http://arch.cs.msu.ru/Page2.htm
  4. http://cmcmsu.no-ip.info/1course/um3.command.set.htm