第 1 关 自检诊断(Self-test Diagnostic)
mov 指令用法:
mov <src> <dst>
作用:将数据源(src)中的数据写入目标点(dst)
例:
# 这条指令将当前节点的 acc 置为 1
mov 1 acc# 这条指令给下方节点发送数字 1
mov 1 down# 这条指令将自己的 acc 中的数字发给下方节点
mov acc down# 这条指令从上方节点接收数字,并将收到的数字存入 acc
mov up acc# 这条指令从上方节点接收数字,并将收到的数字立刻传给下方节点
mov up down
第 2 关 信号放大器 (Signal Amplifier)
当算术指令里的操作数是 acc 自己时,加上/减去的数字是 acc 被覆盖前的数字
# 将 acc 里的数字乘以 2
add acc
# 将 acc 里的数字清零
sub acc
这里可以通过多线程并发减少运行周期
第 3 关 差分信号转换器 (Differential Converter)
# 将 acc 里的数字取反
neg
第 4 关 信号比较器 (Signal Comparator)
无条件跳转指令
jmp <label>
无视原先的执行顺序,强制跳转到标记为 label 的代码行处执行。
零跳转指令
jez <label> (Jump if Equal to Zero)
当 acc 为零时,跳转到标记为 label 的代码行处执行,否则按顺序继续执行
正跳转指令
jgz <label> (Jump if Greater than Zero)
当 acc 大于零时,跳转到标记为 label 的代码行处执行,否则按顺序继续执行
负跳转指令
jlz <label> (Jump if Less than Zero)
当 acc 小于零时,跳转到标记为 label 的代码行处执行,否则按顺序继续执行
非零跳转指令
jnz <label> (Jump if Non Zero)
当 acc 不为零时,跳转到标记为 label 的代码行处执行,否则按顺序继续执行
第 5 关 信号叠加器 (Signal Multiplexer) 
伪代码如下:
acc = up;
if (acc == 0) {
acc = left;
acc += right;
down = acc;
} else if (acc > 0) {
down = right;
acc = left;
} else {
down = left;
acc = right;
}
注意:当一个节点通过mov
指令向相邻节点传值时,接收方必须接收这个值,否则传值节点会阻塞等待,导致后续操作无法进行。因此,即使某个值对当前操作不重要,接收方也应先接收并丢弃该值,以释放传值节点的阻塞状态,确保传值节点能继续正常工作。
第 6 关 序列生成器 (Sequence Generator)
# 将 acc 里的值复制一份到 bak 中
保存指令 sav
# 将 acc 和 bak 寄存器互换。互换后再对 acc 寄存器进行读写操作,操作完毕后再执行一次 swp 换回来,就相当于对 bak 寄存器进行相应的读写操作
交换指令 swp
第 7 关 序列计数器 (Sequence Counter)
第 8 关 信号突变检测器 (Signal Edge Detector)
第 9 关 中断处理器 (Interrupt Handler)
第 10 关 信号模式检测器 (Signal Pattern Detector)
第 11 关 序列峰值检测器 (Sequence Peak Detector)
第 12 关 序列反转器 (Sequence Reverser)
栈存储节点(Stack Memory Node):栈是一个先进后出的数据结构,越先存入的数据越靠后被取出。
第 13 关 乘法器 (Signal Multiplier)
第 14 关 测试图 1 (Image Test Pattern 1)
伪代码如下:
void draw() {
for (int y = 0; y < 18; ++y) {
write(down, 0);
write(down, y);
for (int pixels = 30; pixels != 0; --pixels) {
write(down, 3);
}
write(down, -1);
}
}
第 15 关 测试图 2 (Image Test Pattern 2)
第 16 关 曝光遮罩查看器 (Exposure Mask Viewer)
伪代码如下:
void draw(int x, int y, int w, int h) {
do {
write(down, x);
write(down, y);
for (int pixels = w; pixels != 0; --pixels) {
write(down, 3);
}
write(down, -1);
} while (++y, --h != 0);
}
第 17 关 直方图查看器 (Histogram Viewer)
第 18 关 信号窗口筛选器 (Signal Window Filter)
第 19 关 除法器 (Signal Divier)
第 20 关 序列检索器 (Sequence Indexer)
思路:当栈里有 n 个数字,且要取出第 x 个数字,那么需要弹 n-x 次栈才能取到想要的数。
第 21 关 排序器 (Sequence Sorter)
插入排序:
void insertionSort(int nums[]) {
int acc;
Stack stk1;
Stack stk2;
init(&stk1);
init(&stk2);
push(&stk1, 999);
for (int i = 0; nums[i] != 0; ++i) {
push(&stk2, 0);
acc = pop(&stk1);
while (acc < nums[i]) {
push(&stk2, acc);
acc = pop(&stk1);
}
push(&stk1, acc);
push(&stk1, nums[i]);
acc = pop(&stk2);
while (acc != 0) {
push(&stk1, acc);
acc = pop(&stk2);
}
}
acc = pop(&stk1);
while (acc != 999) {
out(acc);
acc = pop(&stk1);
}
out(0);
}