【TIS-100】wp

第 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);
}

第 22 关 已存储图像解码器 (Stored Image Decoder)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值