diff --git a/frontend/src/components/CodeEditor.vue b/frontend/src/components/CodeEditor.vue
index 6b30156..9364bdd 100644
--- a/frontend/src/components/CodeEditor.vue
+++ b/frontend/src/components/CodeEditor.vue
@@ -57,7 +57,7 @@ function hl(line) {
let h = line.replace(/&/g,'&').replace(//g,'>')
h = h.replace(/(;.*)$/, '$1')
h = h.replace(/^(\s*\w+\s*:)/, '$1')
- h = h.replace(/\b(MOV|ADD|SUB|MUL|DIV|MOD|AND|ORR|EOR|MVN|LSL|LSR|CMP|BEQ|BNE|BGT|BLT|BGE|BLE|LDR|STR|PUSH|POP|OUT|HLT|NOP|B)\b/gi,
+ h = h.replace(/\b(MOV|ADD|SUB|MUL|XDIV|XMOD|AND|ORR|EOR|MVN|LSL|LSR|CMP|BEQ|BNE|BGT|BLT|BGE|BLE|LDR|STR|PUSH|POP|XOUT|XHLT|NOP|B)\b/gi,
'$1')
h = h.replace(/\b(R[0-7])\b/gi, '$1')
h = h.replace(/(\[[^\]]+\])/g, '$1')
diff --git a/frontend/src/lib/levels/01.yaml b/frontend/src/lib/levels/01.yaml
index 4056f29..c57e185 100644
--- a/frontend/src/lib/levels/01.yaml
+++ b/frontend/src/lib/levels/01.yaml
@@ -14,12 +14,12 @@ tutorial:
code: |
MOV R0, #42 ; 把 42 放进 R0
MOV R1, #100 ; 把 100 放进 R1
- - title: HLT 指令
+ - title: XHLT 指令
text: >
- 程序最后要写 `HLT`(halt = 停止),告诉机器"运行结束!"
+ 程序最后要写 `XHLT`(halt = 停止),告诉机器"运行结束!"
code: |
MOV R0, #42
- HLT
+ XHLT
goal: 把数字 **42** 放进 **R0** 寄存器
@@ -34,7 +34,7 @@ testCases:
hints:
- "MOV 的格式:MOV 寄存器, #数字"
- "试试:MOV R0, #???"
- - "答案:MOV R0, #42 然后 HLT"
+ - "答案:MOV R0, #42 然后 XHLT"
starThresholds: [2, 3, 5]
@@ -43,6 +43,6 @@ starterCode: |
; 提示:数字前面要加 # 号
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/02.yaml b/frontend/src/lib/levels/02.yaml
index 57f9d54..a8f1ec3 100644
--- a/frontend/src/lib/levels/02.yaml
+++ b/frontend/src/lib/levels/02.yaml
@@ -30,7 +30,7 @@ testCases:
hints:
- "MOV 寄存器, 寄存器 —— 把右边复制到左边"
- "MOV R1, R0 可以把 R0 复制到 R1"
- - "答案:MOV R1, R0 / MOV R2, R0 / HLT"
+ - "答案:MOV R1, R0 / MOV R2, R0 / XHLT"
starThresholds: [3, 4, 6]
@@ -39,6 +39,6 @@ starterCode: |
; 把 R0 复制到 R1 和 R2
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/03.yaml b/frontend/src/lib/levels/03.yaml
index 8f4d9ee..99e5ca5 100644
--- a/frontend/src/lib/levels/03.yaml
+++ b/frontend/src/lib/levels/03.yaml
@@ -38,7 +38,7 @@ testCases:
hints:
- "ADD 第一个参数放结果,后两个参数相加"
- "ADD R2, R0, R1 —— 结果存入 R2"
- - "答案:ADD R2, R0, R1 / HLT"
+ - "答案:ADD R2, R0, R1 / XHLT"
starThresholds: [2, 3, 5]
@@ -47,6 +47,6 @@ starterCode: |
; 计算 R0 + R1,结果存入 R2
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/04.yaml b/frontend/src/lib/levels/04.yaml
index 33e4268..354308f 100644
--- a/frontend/src/lib/levels/04.yaml
+++ b/frontend/src/lib/levels/04.yaml
@@ -1,7 +1,7 @@
id: 4
title: 乘法与除法
subtitle: 更强的算术能力
-description: 学习 MUL 和 DIV 指令
+description: 学习 MUL 和 XDIV 指令
tutorial:
- title: MUL —— 乘法
@@ -11,13 +11,13 @@ tutorial:
MOV R0, #6
MOV R1, #7
MUL R2, R0, R1 ; R2 = 6 × 7 = 42
- - title: DIV —— 除法(取整)
+ - title: XDIV —— 除法(取整)
text: >
- DIV 做整数除法(只留整数部分):
+ XDIV 做整数除法(只留整数部分):
code: |
MOV R0, #100
MOV R1, #4
- DIV R2, R0, R1 ; R2 = 100 ÷ 4 = 25
+ XDIV R2, R0, R1 ; R2 = 100 ÷ 4 = 25
goal: 计算 **6 × 7** 存入 R0,**100 ÷ 4** 存入 R1
@@ -31,9 +31,9 @@ testCases:
R1: 25
hints:
- - "先 MOV 数字到寄存器,再 MUL/DIV"
+ - "先 MOV 数字到寄存器,再 MUL/XDIV"
- "MUL R0, R2, R3 可以把 R2×R3 的结果放到 R0"
- - "答案:MOV R2, #6 / MOV R3, #7 / MUL R0, R2, R3 / MOV R2, #100 / MOV R3, #4 / DIV R1, R2, R3 / HLT"
+ - "答案:MOV R2, #6 / MOV R3, #7 / MUL R0, R2, R3 / MOV R2, #100 / MOV R3, #4 / XDIV R1, R2, R3 / XHLT"
starThresholds: [7, 9, 12]
@@ -42,6 +42,6 @@ starterCode: |
; 计算 100÷4 存入 R1
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/05.yaml b/frontend/src/lib/levels/05.yaml
index 7eba1b6..9842464 100644
--- a/frontend/src/lib/levels/05.yaml
+++ b/frontend/src/lib/levels/05.yaml
@@ -43,7 +43,7 @@ testCases:
hints:
- "AND 用来保留某些位,把其他位清零"
- "低4位的掩码是 15(二进制 00001111)"
- - "答案:AND R0, R0, #15 / HLT"
+ - "答案:AND R0, R0, #15 / XHLT"
starThresholds: [2, 3, 5]
@@ -52,6 +52,6 @@ starterCode: |
; 用 AND 提取低4位
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/06.yaml b/frontend/src/lib/levels/06.yaml
index e7e8079..03e4d1c 100644
--- a/frontend/src/lib/levels/06.yaml
+++ b/frontend/src/lib/levels/06.yaml
@@ -41,13 +41,13 @@ hints:
- "就这一条指令!"
starThresholds: [2, 3, 5]
-blockedOps: [MUL, DIV]
+blockedOps: [MUL, XDIV]
starterCode: |
; R0 = 5
; 用 LSL 让 R0 变成 40(不能用 MUL)
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/07.yaml b/frontend/src/lib/levels/07.yaml
index ae3970f..1d2fff1 100644
--- a/frontend/src/lib/levels/07.yaml
+++ b/frontend/src/lib/levels/07.yaml
@@ -43,7 +43,7 @@ testCases:
hints:
- "先用 LDR 把内存值读到寄存器,算完用 STR 写回"
- "MOV R3, #0 设基地址,LDR R0, [R3, #0] 读第一个值"
- - "答案:MOV R3, #0 / LDR R0, [R3, #0] / LDR R1, [R3, #1] / ADD R2, R0, R1 / STR R2, [R3, #2] / HLT"
+ - "答案:MOV R3, #0 / LDR R0, [R3, #0] / LDR R1, [R3, #1] / ADD R2, R0, R1 / STR R2, [R3, #2] / XHLT"
starThresholds: [6, 8, 10]
@@ -55,7 +55,7 @@ starterCode: |
; 然后用 LDR/STR 读写内存
- HLT
+ XHLT
showMemory: true
memoryRange: [0, 15]
diff --git a/frontend/src/lib/levels/08.yaml b/frontend/src/lib/levels/08.yaml
index bc968dd..e960edf 100644
--- a/frontend/src/lib/levels/08.yaml
+++ b/frontend/src/lib/levels/08.yaml
@@ -32,7 +32,7 @@ tutorial:
big:
MOV R1, #1 ; R0 > 10
done:
- HLT
+ XHLT
goal: R0=**15**。如果 R0 > 10 则 R1 = **1**;否则 R1 = **0**
@@ -63,7 +63,7 @@ testCases:
hints:
- "先设 R1=#0(默认),再比较 R0 和 10"
- "如果 R0 > 10,跳到标签把 R1 改成 1"
- - "答案:MOV R1, #0 / CMP R0, #10 / BLE done / MOV R1, #1 / done: HLT"
+ - "答案:MOV R1, #0 / CMP R0, #10 / BLE done / MOV R1, #1 / done: XHLT"
starThresholds: [5, 7, 9]
@@ -72,6 +72,6 @@ starterCode: |
; 否则 R1 = 0
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/09.yaml b/frontend/src/lib/levels/09.yaml
index 26ee9d0..28e1683 100644
--- a/frontend/src/lib/levels/09.yaml
+++ b/frontend/src/lib/levels/09.yaml
@@ -16,7 +16,7 @@ tutorial:
ADD R4, R4, #1 ; ②③ 计数+1
CMP R4, #5 ; ④ 到5了吗?
BLE loop ; 没到就跳回
- HLT
+ XHLT
- title: 注意!
text: >
忘了更新计数器 = **死循环**(别担心,超过10000步会自动停止)。
@@ -34,7 +34,7 @@ testCases:
hints:
- "R0 累加结果,R4 做计数器(1到10)"
- "循环体:ADD R0, R0, R4 / ADD R4, R4, #1 / CMP R4, #10 / BLE loop"
- - "完整:MOV R0, #0 / MOV R4, #1 / loop: ADD R0, R0, R4 / ADD R4, R4, #1 / CMP R4, #10 / BLE loop / HLT"
+ - "完整:MOV R0, #0 / MOV R4, #1 / loop: ADD R0, R0, R4 / ADD R4, R4, #1 / CMP R4, #10 / BLE loop / XHLT"
starThresholds: [7, 9, 12]
@@ -45,6 +45,6 @@ starterCode: |
; 提示:用一个寄存器做计数器
- HLT
+ XHLT
showMemory: false
diff --git a/frontend/src/lib/levels/10.yaml b/frontend/src/lib/levels/10.yaml
index 74fea42..ecda51a 100644
--- a/frontend/src/lib/levels/10.yaml
+++ b/frontend/src/lib/levels/10.yaml
@@ -75,7 +75,7 @@ starterCode: |
; 用 MOV + LDR 读取内存
- HLT
+ XHLT
showMemory: true
memoryRange: [0, 15]
diff --git a/frontend/src/lib/vm.js b/frontend/src/lib/vm.js
index a96b9c4..f4d315c 100644
--- a/frontend/src/lib/vm.js
+++ b/frontend/src/lib/vm.js
@@ -1,9 +1,9 @@
const REGISTERS = ['R0','R1','R2','R3','R4','R5','R6','R7']
const OPCODES = [
- 'MOV','ADD','SUB','MUL','DIV','MOD',
+ 'MOV','ADD','SUB','MUL','XDIV','XMOD',
'AND','ORR','EOR','MVN','LSL','LSR',
'CMP','B','BEQ','BNE','BGT','BLT','BGE','BLE',
- 'LDR','STR','PUSH','POP','OUT','HLT','NOP',
+ 'LDR','STR','PUSH','POP','XOUT','XHLT','NOP',
]
const BRANCH_OPS = ['B','BEQ','BNE','BGT','BLT','BGE','BLE']
const MAX_STEPS = 10000
@@ -198,7 +198,7 @@ export function createVM() {
try {
switch (opcode) {
case 'NOP': break
- case 'HLT': state.halted = true; break
+ case 'XHLT': state.halted = true; break
case 'MOV':
setReg(ops[0], getVal(ops[1]), changes)
@@ -207,11 +207,11 @@ export function createVM() {
case 'ADD': { const r = arith3(ops, (a,b) => a+b); state.flags.carry = r > 0xFFFF; setReg(ops[0], r, changes); updateFlags(r); break }
case 'SUB': { const r = arith3(ops, (a,b) => a-b); state.flags.carry = r < 0; setReg(ops[0], r, changes); updateFlags(r); break }
case 'MUL': { const r = arith3(ops, (a,b) => a*b); state.flags.carry = r > 0xFFFF; setReg(ops[0], r, changes); updateFlags(r); break }
- case 'DIV': {
+ case 'XDIV': {
const r = arith3(ops, (a,b) => { if(b===0) throw new Error('除以零!'); return Math.floor(a/b) })
setReg(ops[0], r, changes); updateFlags(r); break
}
- case 'MOD': {
+ case 'XMOD': {
const r = arith3(ops, (a,b) => { if(b===0) throw new Error('除以零!'); return a%b })
setReg(ops[0], r, changes); updateFlags(r); break
}
@@ -274,7 +274,7 @@ export function createVM() {
break
}
- case 'OUT': {
+ case 'XOUT': {
const v = getVal(ops[0])
state.output.push(v)
changes.push({ type: 'output', val: v })