Browse Source

SVI Добавил операции над регистром

SVI 10 months ago
parent
commit
7c4f1c8087
5 changed files with 51 additions and 0 deletions
  1. 18 0
      assets/prog.risc.asm
  2. 6 0
      cpu/asm_mem/asm_cmd/asm_cmd.go
  3. 15 0
      cpu/asm_reg/asm_reg.go
  4. 9 0
      cpu/cpu.go
  5. 3 0
      pkg/cons/cons.go

+ 18 - 0
assets/prog.risc.asm

@@ -5,6 +5,24 @@
 упр.метка  @старт
 пусто
 
+рег.уст    6  р0
+рег.уст    7  р1
+рег.и      2  р1
+рег.и      -3 р1
+упр.идти   @старт
+
+рег.уст    6  р0
+рег.уст    5  р1
+рег.или    2  р1
+рег.или    -3 р1
+упр.идти   @старт
+
+рег.уст    6  р0
+рег.уст    51 р1
+рег.дел    р1 7
+рег.дел    р1 -2
+упр.идти   @старт
+
 рег.уст    6  р0
 рег.уст    5  р1
 рег.умн    2  р1

+ 6 - 0
cpu/asm_mem/asm_cmd/asm_cmd.go

@@ -52,6 +52,12 @@ func NewAsmCmd(cmd string) *AsmCmd {
 		sf.cmd = cons.AsmRegSub
 	case "рег.умн":
 		sf.cmd = cons.AsmRegMul
+	case "рег.дел":
+		sf.cmd = cons.AsmRegDiv
+	case "рег.или":
+		sf.cmd = cons.AsmRegOr
+	case "рег.и":
+		sf.cmd = cons.AsmRegAnd
 	case "проц.уст":
 		sf.cmd = cons.AsmProcSet
 	case "проц.обмен":

+ 15 - 0
cpu/asm_reg/asm_reg.go

@@ -12,6 +12,21 @@ func NewAsmReg() *AsmReg {
 	return sf
 }
 
+// Abd -- И числа и регистра
+func (sf *AsmReg) And(val int32) {
+	sf.val &= val
+}
+
+// Or -- ИЛИ числа и регистра
+func (sf *AsmReg) Or(val int32) {
+	sf.val |= val
+}
+
+// Div -- деление РЕГИСТРА на число
+func (sf *AsmReg) Div(val int32) {
+	sf.val /= val
+}
+
 // Mul -- умножает число и регистр
 func (sf *AsmReg) Mul(val int32) {
 	sf.val *= val

+ 9 - 0
cpu/cpu.go

@@ -87,6 +87,15 @@ func (sf *Cpu) Step() {
 	case cons.AsmRegMul: // Умножение числа и регистра
 		reg := sf.reg(cmd.StrP2())
 		reg.Mul(cmd.P1())
+	case cons.AsmRegDiv: // Деление РЕГИСТРА на число
+		reg := sf.reg(cmd.StrP1())
+		reg.Div(cmd.P2())
+	case cons.AsmRegOr: // ИЛИ числа и регистра
+		reg := sf.reg(cmd.StrP2())
+		reg.Or(cmd.P1())
+	case cons.AsmRegAnd: // И числа и регистра
+		reg := sf.reg(cmd.StrP2())
+		reg.And(cmd.P1())
 	case cons.AsmProcSet: // Установить значение регистра другим регистром
 		reg1 := sf.reg(cmd.StrP1())
 		reg2 := sf.reg(cmd.StrP2())

+ 3 - 0
pkg/cons/cons.go

@@ -10,6 +10,9 @@ const ( // AsmCmd -- команды ассемблера
 	AsmRegAdd          // Добавление числа к регистру
 	AsmRegSub          // Вычитание ИЗ РЕГИСТРА числа
 	AsmRegMul          // Умножение числа и регистра
+	AsmRegDiv          // Деление РЕГИСТРА на число
+	AsmRegOr           // Или числа и регистра
+	AsmRegAnd          // И числа и регистра
 
 	AsmProcSet  // Установить значение регистра значением другого регистра
 	AsmProcSwap // Обмен значений двух регистров