//以下是循环左移位的程序
L 1 //移位的位数
T #bSNum
L 8 //需要移位的地址总数
T #bNum
//保存移出的位
L P#M 110.0 //需要移位起始地址
LAR1
T #dwAdd
LAR2 P##wReg
L #bNum
DEC 1
TAR1
+D
LAR1
L #bSNum //循环初始化
cyc1: T #bTemp
A [AR1,P#0.0]
= [AR2,P#0.0]
TAR2
+ 1
LAR2
TAR1
L L#1
-D
LAR1
L #bTemp
LOOP cyc1
//循环左移位
L #dwAdd
LAR1
LAR2
L #bNum
DEC 1
TAR1
+D
LAR1
L #bNum
L #bSNum
-I
L 1
-I
TAR2
+D
LAR2
L #bNum
L #bSNum
-I
cyc2: T #bTemp //循环初始化
A [AR2,P#0.0]
= [AR1,P#0.0]
TAR1
L L#1
-D
LAR1
TAR2
L L#1
-D
LAR2
L #bTemp
LOOP cyc2
//装入移出的位
LAR2 #dwAdd //装入起始地址
LAR1 P##wReg //装入绶存的起始地址
L #bSNum
DEC 1
TAR2
+D
LAR2
L #bSNum //循环初始化
cyc3: T #bTemp
A [AR1,P#0.0]
= [AR2,P#0.0]
TAR1
+ 1
LAR1
TAR2
L L#1
-D
LAR2
L #bTemp
LOOP cyc3
注意:未考虑数据的有效性、扫描周期(最大128地址时移位100多位时出错了),指令还可以更加简洁,相信还有更加高效的算法.
对于局部变量如果通过指针间接访问未定义的变量不知道会不会破坏数据区,关系到wReg变量的定义。