控制指命令
1.NOP 空操作,在建立流水线和执行延时的情况下有用。
2.CLRC control bit 清控制位
3.SETC control bit 置控制位
control bit可以是:C、CNF、INTM、OVM、SXM、TC、XF。
4.IDLE 等机
受INTM位的影响
PC+1 -> PC
进入空闲模式,片内内设保持激活状态
未被屏蔽中断激活 (这里的屏蔽是指中断控制寄存器里的屏蔽位(0004H))
INTM=0,程序转移到它所影响的中断服务程序
INTM=1,程序返回IDLE的下一条指令继续执行。如时是不可蔽屏中断MNI或RESET,进中断服务程序。
5.BIT 位测试
BIT dma, bit code (不是# bit code)
BIT ind, bit code[, ARn]
影响TC, 数据被指定的位复制到TC,测试的位号=15 – bit code,所以要测试第6位的,那么bit code = 9。
我们可以在头文件中定义:BIT0 .set 15
BIT1 .set 14 ……
则在写BIT指令时就符合我们的习惯用法,如:BIT *, BIT0
6.BITT 按TREG进行位测试
BIT dma
BIT ind[, ARn]
参考BIT指令,相当于的TREG低四位赋值给bit code后执行。
7.LDP 装载页面指针
LDP dma
LDP ind[, ARn]
LDP #k (k如果超过9位,编译时会发出警告并丢弃高7位)
影响DP位,LST #0也可以修改DP。
8.LST 装载状态寄存器
LST #m, dma m=0加载到ST0,m=1加载到ST1
LST #m, ind[, ARn]
影响ST0、ST1中除INTM外所有的标志位
指令可用来中断或程序调用后来恢复状态寄存器
LST #0改变ST0的ARP,ST1的ARB不受影响(原本是ARP改变时,原ARP值存入ARB)
LST #m, ind, ARn对ARP、ARB的影响同上,但乎略了ARn的影响。原指令等同于LST #m, ind (不写ARn可读性更好),即对ARP、ARB的影响来自间接寻址的数据。
状态寄存器的保留位总是读1,写操作对这些位无影响。
测试时数据一直不对,原来是间接寻址时,误认为是把当前AR的值装入STm,其实当前AR的值只是一个地址,装入的是AR值所指向的地址单元。修改程序后结果正确。
9.SST 保存状态寄存器
SST #m, dma 不论DP为何值,直接寻址总是保存在第0页
SST #m,ind[, ARn]
10.SPM 设定乘积输出方式
SPM constant(0~3) (不是# constant)
constant->PM 参考PM说明
当constant超出范围时编译时不是警告后取低两位,而是错误提示。
11.RPT 重复下一条指令
RPT dma
RPT ind[, ARn]
RPT #k
重复执行下条指令N次,N为RPTC(16位重复计数器)的初始值加1。
在上下文转换时不能保存PRTC,PRTC被清0。器件复位PRTC清0。
重复循环可看作是可中断多期指令。
对于块移动,相乘/累加和规格化等操作,RPT特别有用。
重复指令本身不能被重复。如:RPT #1
RPT #3
编译可以通过,但运行时执行第二条RPT后,RPTC != 3,PRTC = 0。
12.POP 弹出栈至累加器
TOP(堆栈顶) -> ACC (硬件堆栈是FIFO 的8个单元)
堆栈中的每个值都复制到地址加1的堆栈单元。
要注意没有检查下溢的方法。
13.PUSH 累加器低位入栈
ACC -> TOP
堆栈中的每个值者复制到地址减一单元,最后一个数据丢失。
14.POPD 弹出堆栈至数据存储器
POPD dma
POPD ind[, ARn]
15.PSHD 数据入栈
PSHD dma
PSHD ind[, ARn]
堆栈操作和POP、PUSH一样。
分支跳转指令
1.B pma[, ind[, ARn]] 分支跳转
Pma -> PC
2.BACC 按ACC跳转
ACCL -> PC
3.BANZ pma[, ind[, ARn]] AR非零跳转
当前AR = 0, PC+2 -> PC
当前AR != 0, pma -> PC
注意:当前AR默认修改为减1;如BANZ PGM 等同于 BANZ PGM, *- 。
故可以用一个AR做循环计数,
如:PGM: NOP (循环次数为当前AR值+1)
BANZ PGM
4.BCND 条件跳转
BCND pma,cond1[, cond2][, …] 如果指定条件都满足,则跳转
Cond 条件
EQ ACC=0 并不是所有的条件的组合都有意义
NEQ ACC!=0 多条件跳转时要注意冲突
LT ACC<0
LEQ ACC<=0 冲突会错误提示,如:
GT ACC>0 LT和GT
GEQ ACC>=0 UNC和所有的条件
NC C=0 EQ和NEQ 和LEQ和GEQ任意两个
C C=1 C和NC、OV和NOV、NTC和TC和BIO任意两个
NOV OV=0 (除N外,其它有字母相同的条件就冲突)
OV OV=1
BIO BIO引脚为低电平
NTC TC=0
TC TC=1
UNC 无条件
5.CC pma, cond1[, cond2][, …] 条件调用
它同BCND的区别只在于BCND不保存断点
6.CALA 根据ACC的程序调用
PC+1 -> TOS
ACCL -> PC
它同BACC的区别只在于BACC不保存断点
7.CALL pma[, ind[, ARn]] 无条件跳转
它同B的区别只在于B不保存断点
8.RET 返回
TOS -> PC
子程序和中断服务程序以RET指令结束
9.RETC 条件返回
RETC cond1[,cond2][, …]
指定条件都满足,就执行一个标准返回。
条件同BCND说明。
10.INTR 软中断
INTR k 0~31 ( 非 #k )
不受INTM和中断屏蔽位影响。
PC+1 -> TOS
K*2 -> PC
INTM=1
11.NMI 不可屏蔽中断指令
等于 INTR 18
12.TRAP 软件陷阱中断
相当于INTR 17;但不受INTM影响,也不影响INTM(唯一不置INTM的中断)。 |