Browse Source

SVI Добавил XOR числа и регистра

SVI 10 months ago
parent
commit
4047ef8a49
5 changed files with 17 additions and 0 deletions
  1. 6 0
      assets/prog.risc.asm
  2. 2 0
      cpu/asm_mem/asm_cmd/asm_cmd.go
  3. 5 0
      cpu/asm_reg/asm_reg.go
  4. 3 0
      cpu/cpu.go
  5. 1 0
      pkg/cons/cons.go

+ 6 - 0
assets/prog.risc.asm

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

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

@@ -60,6 +60,8 @@ func NewAsmCmd(cmd string) *AsmCmd {
 		sf.cmd = cons.AsmRegAnd
 	case "рег.не":
 		sf.cmd = cons.AsmRegNot
+	case "рег.ксор":
+		sf.cmd = cons.AsmRegXor
 	case "проц.уст":
 		sf.cmd = cons.AsmProcSet
 	case "проц.обмен":

+ 5 - 0
cpu/asm_reg/asm_reg.go

@@ -12,6 +12,11 @@ func NewAsmReg() *AsmReg {
 	return sf
 }
 
+// XOR -- XOR числа b регистра
+func (sf *AsmReg) Xor(val int32) {
+	sf.val ^= val
+}
+
 // Not -- инверсия регистра
 func (sf *AsmReg) Not() {
 	sf.val ^= sf.val

+ 3 - 0
cpu/cpu.go

@@ -99,6 +99,9 @@ func (sf *Cpu) Step() {
 	case cons.AsmRegNot: // НЕ числа и регистра
 		reg := sf.reg(cmd.StrP1())
 		reg.Not()
+	case cons.AsmRegXor: // XOR числа и регистра
+		reg := sf.reg(cmd.StrP2())
+		reg.Xor(cmd.P1())
 	case cons.AsmProcSet: // Установить значение регистра другим регистром
 		reg1 := sf.reg(cmd.StrP1())
 		reg2 := sf.reg(cmd.StrP2())

+ 1 - 0
pkg/cons/cons.go

@@ -14,6 +14,7 @@ const ( // AsmCmd -- команды ассемблера
 	AsmRegOr           // Или числа и регистра
 	AsmRegAnd          // И числа и регистра
 	AsmRegNot          // НЕ регистра
+	AsmRegXor          // XOR числа и регистра
 
 	AsmProcSet  // Установить значение регистра значением другого регистра
 	AsmProcSwap // Обмен значений двух регистров