基本概念
-
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
是合法的