Skip to main content

寄存器指令

内容寄存器为数据计算提供储存空间。
我们可以通过寄存器指令对寄存器中储存的数值进行操作,并根据寄存器数值的变化在一定条件下改变指令运行的顺序。

0x10 写入寄存器值

向指定寄存器写入数值。

tip

运行结果可以在辅助屏的寄存器信息页面实时查看。

INST_WRITE_REG编号sOP00sOP01OP-1
03E8写入寄存器R1C10001C03E8
info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
OP-10000~FFFF写入值的十六进制数值

0x11 复制寄存器值

复制指定寄存器值到另一个寄存器。

tip

运行结果可以在辅助屏的寄存器信息页面实时查看。

INST_REG_COPY编号sOP00sOP01sOP10sOP11
将寄存器R1C值复制到R1D11001D001C
info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定目标寄存器编号
sOP1000忽略
sOP1100~3F指定源寄存器编号

0x12 增减寄存器值

增加或减少指定寄存器的值。

tip

可以约定是否允许寄存器储存值溢出。

caution

如果不允许溢出,寄存器值最大增加到FFFF,最小减少到0000

INST_REG_INC_DEC编号sOP00sOP01OP-1
将寄存器R1C值增加03E8,不允许溢出12001C03E8
将寄存器R1C值增加0FFF,允许溢出12011C0FFF

假设寄存器R1C中已经存储值FF00,而上面第1行指令想要增加值03E8

(FF00)16+(03E8)16=(1  02E8)16(FF00)_{16}+(03E8)_{16}=(1\;02E8)_{16}

计算结果应为十六进制值1 02E8,占用17个bit。
而在寄存器存储时,如果不允许溢出,将只保留最低的16-bit,运算结果将自动修正为02E8

info
OP/sOP取值含义
sOP0000增加值但不允许溢出
01增加值并允许溢出
10减少值但不允许溢出
11减少值并允许溢出
sOP0100~3F指定寄存器编号
OP-100~FF增减值

0x13 输出寄存器值

输出指定寄存器的值到数字端口。

INST_REG_TO_PORT编号sOP00sOP01OP-1
将寄存器R04值输出到数字端口1300040000

假设寄存器R04中已经存储值3579

(3579)16=(13689)10(3579)_{16}=(13689)_{10}

转化为二进制则是:

(11  0101  0111  1001)2(11\;0101\;0111\;1001)_{2}

只考虑最末尾一位数:

(9)16=(9)10=(1001)2(9)_{16}=(9)_{10}=(1001)_{2}

那么表示十进制值尾数9的4-bit二进制值将被输出到数字端口。
4个LED指示灯也将显示输出值对应的亮灭状态。

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
OP-10000忽略

0x14 指定值输入寄存器

将输入端口全部4个管脚对应的二进制值输入到指定寄存器。

tip

输入值的范围为0000~000F

(000F)16=(1111)2(000F)_{16}=(1111)_{2}

最大值是管脚全部输出为高时对应的二进制数1111

INST_PORT_TO_REG编号sOP00sOP01OP-1
将输入端口对应的二进制值存储到寄存器R041400040000

假设4个输入管脚的状态为高、低、高、低,对应二进制值1010,那么:

(1010)2=(000C)16(1010)_{2}=(000C)_{16}

转换成十六进制的值则是000C,所以写入到寄存器R04的值就是000C

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
OP-10000忽略

0x15 逻辑运算:移位

将指定寄存器存储值向左或向右移位指定位数。

INST_BITSHIFT编号sOP00sOP01sOP10sOP11
将寄存器R07存储值右移2位,不可循环1500070002
将寄存器R07存储值左移2位,允许循环1511070002

假设寄存器R07存储值是8009,那么对应二进制值:

(8009)16=(1000  0000  0000  1001)2(8009)_{16}=(1000\;0000\;0000\;1001)_{2}

如果不允许循环,向右移位2位的结果是:

(0010  0000  0000  0010)2=(2002)16(0010\;0000\;0000\;0010)_{2}=(2002)_{16}

注意原存储值最右侧的2位数值被移出,因此执行指令后寄存器值变为2002
而如果允许循环,同样向右移位2位的结果就变成了:

(0110  0000  0000  0010)2=(6002)16(0110\;0000\;0000\;0010)_{2}=(6002)_{16}

这时存储值最右侧的2位数值被循环移位到了最左侧2位,执行指令后寄存器值变为6002

info
OP/sOP取值含义
sOP0000向右移位不可循环
01向右移位允许循环
10向左移位不可循环
11向左移位允许循环
sOP0100~3F指定寄存器编号
sOP1000忽略
sOP1100~FF移位位数

0x16 逻辑运算:按位取反

将指定寄存器存储值对应的二进制值按位取反后,将结果转换为十六进制存储到该寄存器。

INST_BIT_REVERSE编号sOP00sOP01OP-1
将寄存器R07存储值逐位取反1600070000

假设寄存器R07存储值是8009,对应的二进制值就是:

(8009)16=(1000  0000  0000  1001)2(8009)_{16}=(1000\;0000\;0000\;1001)_{2}

按位将该数值取反得到:

(0111  1111  1111  0110)2=(7FF6)16(0111\;1111\;1111\;0110)_{2}=(7FF6)_{16}

所以,存入寄存器的新值就是7FF6

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
OP-10000忽略

0x17 逻辑运算:按位与

对2个指定寄存器存储值做按位与运算,并将结果存储到前一个寄存器中。

INST_REG_AND编号sOP00sOP01sOP10sOP11
将寄存器R07R09存储值进行与运算,保存结果到R071700070009

假设寄存器R07存储值是8009R09存储值是FF00,他们对应的二进制值分别是:

(8009)16=(1000  0000  0000  1001)2(FF00)16=(1111  1111  0000  0000)2(8009)_{16}=(1000\;0000\;0000\;1001)_{2}\\ (FF00)_{16}=(1111\;1111\;0000\;0000)_{2}

对两个寄存器进行按位与运算结果是:

(1000  0000  0000  0000)2=(8000)16(1000\;0000\;0000\;0000)_{2}=(8000)_{16}

运算结果8000存储到寄存器R09

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
sOP1000忽略
sOP1100~3F指定及存储目标寄存器编号

0x18 逻辑运算:按位或

对2个指定寄存器存储值做按位与运算,并将结果存储到前一个寄存器中。

INST_REG_OR编号sOP00sOP01sOP10sOP11
将寄存器R07R09存储值进行或运算,保存结果到R071800070009

假设寄存器R07存储值是8009R09存储值是FF00,他们对应的二进制值分别是:

(8009)16=(1000  0000  0000  1001)2(FF00)16=(1111  1111  0000  0000)2(8009)_{16}=(1000\;0000\;0000\;1001)_{2}\\ (FF00)_{16}=(1111\;1111\;0000\;0000)_{2}

对两个寄存器进行按位与运算结果是:

(1111  1111  0000  1001)2=(FF09)16(1111\;1111\;0000\;1001)_{2}=(FF09)_{16}

运算结果FF09存储到寄存器R09

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
sOP1000忽略
sOP1100~3F指定及存储目标寄存器编号

0x1A 数值运算:加法

对指定寄存器存储值做加法数值运算,并将结果存储到前一个寄存器中。

INST_REG_SUM编号sOP00sOP01sOP10sOP11
计算R08R06存储值的和,保存结果到R081A00080006

假设R08存储值是1234R06存储值是0020
两者相加结果是1254,保存到前一个寄存器R08

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定及存储目标寄存器编号
sOP1000忽略
sOP1100~3F指定寄存器编号

0x1B 数值运算:减法

对指定寄存器存储值做减法数值运算,并将结果存储到前一个寄存器中。

INST_REG_SUB编号sOP00sOP01sOP10sOP11
计算R08R06存储值的差,并将结果保存在R081B00080006

假设R08存储值是1234R06存储值是0020
前者减去后者结果是1214,保存到前一个寄存器R08

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定及存储目标寄存器编号
sOP1000忽略
sOP1100~3F指定寄存器编号

0x1C 数值运算:乘法

对指定寄存器存储值做乘法数值运算,并将结果存储到前一个寄存器中。

INST_REG_PROD编号sOP00sOP01sOP10sOP11
计算R08乘以R06存储值的积,并将结果保存在R081C00080006

假设R08存储值是1234R06存储值是0020

(1234)16(0020)16=(2  4680)16(1234)_{16}\cdot(0020)_{16}=(2\;4680)_{16}

两者相乘结果是2 4680,此时发生溢出,仅保留较低的16-bit值4680
保存到前一个寄存器R08

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定及存储目标寄存器编号
sOP1000忽略
sOP1100~3F指定寄存器编号

0x1D 数值运算:除法

对指定寄存器存储值做除法数值运算,并将结果存储到前一个寄存器中。

INST_REG_DIVISION编号sOP00sOP01sOP10sOP11
计算R08除以R06存储值的商,并将结果保存在R081D00080006

假设R08存储值是1234R06存储值是0020

(1234)16÷(0020)16=(0091)16(1234)_{16}\div(0020)_{16}=(0091)_{16}

前者除以后者的结果是0091
保存到前一个寄存器R08

caution

注意这里的除法为整型数除法,只保留除法运算的商。余数则需要使用1E指令计算得出。

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定及存储目标寄存器编号
sOP1000忽略
sOP1100~3F指定寄存器编号

0x1E 数值运算:求余

对指定寄存器存储值做除法数值运算,并将余数存储到前一个寄存器中。

INST_REG_REMAINDE编号sOP00sOP01sOP10sOP11
计算R08除以R06存储值的余数,并将结果保存在R081D00080006

假设R08存储值是1234R06存储值是0020

(1234)16%(0020)16=(0014)16(1234)_{16}\%(0020)_{16}=(0014)_{16}

前者除以后者的余数是0014
保存到前一个寄存器R08

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定及存储目标寄存器编号
sOP1000忽略
sOP1100~3F指定寄存器编号

0x1F 生成随机数

生成一个随机数并存储到指定寄存器中。

INST_REG_REMAINDE编号sOP00sOP01OP-1
生成一个随机数并保存到R051F00050000
info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
OP-10000忽略

0x20 高低位:重组

将2个指定寄存器的高低位重新组合,并存储到前一个指定寄存器中。

INST_BYTE_COMPOSE编号sOP00sOP01sOP10sOP11
重组R05R06的高低位,并将结果保存在R052000050006

假设寄存器R05存储值是2450,取高八位;
假设寄存器R06存储值是FF00,取低八位;
所以重组后存储到R05的值是2400

info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定及存储目标寄存器编号
sOP1000忽略
sOP1100~3F指定寄存器编号

0x21 高低位:交换

将指定寄存器存储值的高8-bit与低8-bit交换。

INST_BYTE_SWAP编号sOP00sOP01OP-1
将寄存器R05存储值的高、低8-bit互换2100050000
info
OP/sOP取值含义
sOP0000忽略
sOP0100~3F指定寄存器编号
OP-10000忽略