基本概念

  • X, T: 值register, 可以储存数字或者keyword

  • F: 文件register,文件指针的初始位置是0,读写操作(或者TEST操作)后自增

  • M: 通信register,一个写一个读,非广播,the val is transmitted from writer to reader. 读写不需要同步

基本语句

移动

  • HOST R:复制目前的HOST名称到寄存器。

  • LINK 800: traverse link 800

寄存器操作

  • COPY F X: 读取文件F,复制到寄存器X.

  • COPY 0 X: 将寄存器X设置为0.

  • ADDI X F X: 计算 F+X,写入X

  • SUBI X F X: 计算 X-F, 写入X

  • MULI X F X: 计算 F x X,写入X

  • DIVI X F X: 计算F/X, 写入X

  • MODI X F X: 计算F%X,写入X

  • SWIZ R/N(INPUT) R/N(MASK) R: 用MASK改变INPUT的顺序。 MASK顺序:最右侧为1. 

 6789,   4321 -> 6789
 6789,  -4321 -> 6789
 6789,   1234 -> 9876
-6789,  -4321 -> 6789
 6789,   3333 -> 7777
 6789,   2000 -> 8000
 6789,   0001 -> 0009

文件操作

  • MAKE: 创建新文件

  • WIPE:  删除拿着的文件

  • GRAB R/N: 拿起特定ID文件,可直接用文件号,或者用存有文件号的寄存器. 同时只能拿一个文件。不可以GRAB F。

  • FILE R:复制手中文件的ID到寄存器R.

  • DROP: 放下手中的文件

  • SEEK R/N: 移动文件指针。SEEK -9999移动到文件开头,SEEK 9999移动到文件末尾

  • VOID F: 删除目前文件指针所指位置的值。

  • TEST EOF: 检测目前是否在文件末尾,是则设置寄存器T为1,否则设为0.

控制流

  • TEST X = Y, TEST X > Y, TEST X < Y

  • JUMP L: 跳转到L

  • TJMP L, FJMP L: 根据TEST结果跳转到L

线程

  • REPL L: 创建当前EXA的copy,跳转到L标记的行。如果当前EXA手里有文件,则文件不会被复制,仍然在原先的EXA的手中。

  • HALT: exit

  • KILL:杀死同一个host中的另一个EXA,优先同一个用户创建的EXA。如果有多于一个目标,随机选择。

可以导致HALT的错误:

  • divide by zero

  • math with keywords

  • invalid F register access (手里没文件)

  • invalid hardware register access

  • invalid file access (grab不存在的文件)

  • invalid link traversal (走不存在的link)

  • delete a file that cannot be deleted

通信

  • MODE:切换M寄存器的local/global模式。

  • VOID M:读取并discard M寄存器内的值。

  • TEST MRD:检验M寄存器是否有可读取的数据,有,则向T寄存器写入1,否则写入0. 不需要同步,只要(可以理解为容量为1的)queue里有数据即可

  • 连通性:不需要link双向互通,通信即可双向互通

其他

  • MARK:标记

  • NOOP:啥也不做空cycle

  • RAND R/N R/N R:  产生第一个值和第二个值之间(包含两端)的一个随机值,存入寄存器。

macro

@REP N

N必须是数字,不能是寄存器

@{N,M} This substitutes a calculated numerical constant. On the first repetition, the value N will be used. On subsequent repetitions, the value will increase by M each time. N and M have to be constant numbers.

例子:(向文件F写入9999, 10遍)

COPY 0 X

MARK LOOP

COPY 9999 F

ADDI X 1 X

TEST X = 10

FJMP LOOP

TIPS

可以把要TEST但之后不会再用的数据存在寄存器T中,比较后寄存器T的数值被0/1覆盖

HOST T
TEST T =  X

判断X是字符串还是数字

TEST X>-9999 #字符串:False 数字:True

TEST语句测试文件时,文件指针自增。如果要操作上一条

SEEK -1

跳到文件末尾

SEEK 9999

从文件任意位置跳到文件开头

SEEK -9999

读写硬件寄存器

COPY #NERV X
COPY 50 #NERV

硬件寄存器可以直接用于test

TEST #CASH = 0

循环次数较少并固定时,可以不用test/jump,直接重复需要循环的语句。

REP不能互相嵌套。也不能包含loop(否则会重复报错)。

@REP 4
COPY F M
@END

@REP 5
COPY @{1, 1} F
@END

@REP 3
TEST X = @{0, 5}
TJMP CASE@{0, 1}
@END

一次M通信占用两个cycle (发1,收1)

MODE不占cycle

global和local模式的通信是不互通的。善用切换 ,结合空间,解决contention。

无论是global还是local通信,都不是广播,一个packet只能被一个EXA接收到。

可以利用会导致halt的错误销毁exa。

ADDI F F X 是合法的

GRAB M是合法的

SEEK F是合法的