姑苏大侠和其它大侠写的循环移位功能强大让我学习良多!看到大多数贴子中被移位的存储器多是8位的整数倍的,我在思考,如果被移位存储器中只有7位而且跨字节,需要循环移位该如何处理呢?如果被移位存储器里面只有12位、33位、111位、3333位要循环移位又该如何处理呢?后来看到论坛讨论ANY形参数据类型指针的话题,为了学习它的用法,结合此贴和我的纠结,刚好也试着编写相关代码,并且测试通过!以下是(循环左移)相关代码,请大家多补充多斧正!
程序设计原理图如下:

代码如下:

//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬将ANY指针复制到LB0-LB9并判断输入错误╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
L P##SRCBLK //将ANY指针复制到LB0-LB9
LAR1
L D [AR1,P#0.0]
T LD 0
L D [AR1,P#4.0]
T LD 4
L W [AR1,P#8.0]
T LW 8
L B#16#10 //如果输入指针类型错误,程序错误,结束并返回555数值
L LB 0
==I
JCN EROR
L B#16#1 //如果输入数据类型不为Bool,程序错误,结束并返回555数值
L LB 1
==I
JCN EROR
L B#16#85 //如果输入数据区为背景数据块,程序错误,结束并返回555数值
L LB 6
==I
JC EROR
L B#16#86 //如果输入数据区为L区,程序错误,结束并返回555数值
L LB 6
==I
JC EROR
L B#16#87 //如果输入数据区为V区,程序错误,结束并返回555数值
L LB 6
==I
JC EROR
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬(读取数据区最高位的地址起始地址)╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
L LW 2 //数据长度(BIT)
ITD
L LD 6 //数据区的起始地址(32位指针信息)
+D
T LD 10 //数据区最高位的地址
L #ROTATE_NO //循环左移位数
ITD
-D
T LD 10 //数据区最高位的地址起始地址
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬(当N为特殊情况时的处理)╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
L #ROTATE_NO //循环左移位数
L LW 2 //数据长度(BIT)
>I //JUMP EROR
JC EROR
L #ROTATE_NO //循环左移位数
L 32767
>I //JUMP EROR
JC EROR
L #ROTATE_NO //循环左移位数
L 0
<I //JUMP EROR
JC EROR
L LW 2 //数据长度(BIT)
L #ROTATE_NO //循环左移位数
==I //JUMP SAME
JC SAME
L 0 //如果移位数为0
L #ROTATE_NO //循环左移位数
==I //JUMP SAME
JC SAME
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬(把数据区的高N位移入数据块存储)╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
LAR1 LD 10 //数据区最高位的地址起始地址
LAR2 P#0.0
L #ROTATE_NO //循环左移位数
NEX1: T LW 100
L LW 4 //判断是不是DB块
L 0
>I
JCN DBX1
OPN DB [LW 4]
A [AR1,P#0.0]
= L 20.0
OPN #SAVE_TO_DB
A L 20.0
= DBX [AR2,P#0.0]
JU ADD1
DBX1: OPN #SAVE_TO_DB
A [AR1,P#0.0]
= DBX [AR2,P#0.0]
ADD1: +AR1 P#0.1
+AR2 P#0.1
L LW 100
LOOP NEX1
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬(把数据区的低[BOOL Y-N]位移入数据块存储)╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
LAR1 LD 6 //数据区的起始地址(32位指针信息)
L LW 2 //数据长度(BIT)
L #ROTATE_NO
-I
NEX2: T LW 100 //低位区移出的次数
L LW 4 //判断是不是DB块
L 0
>I
JCN DBX2
OPN DB [LW 4]
A [AR1,P#0.0]
= L 20.0
OPN #SAVE_TO_DB
A L 20.0
= DBX [AR2,P#0.0]
JU ADD2
DBX2: OPN #SAVE_TO_DB
A [AR1,P#0.0]
= DBX [AR2,P#0.0]
ADD2: +AR1 P#0.1
+AR2 P#0.1
L LW 100
LOOP NEX2
JU END
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬(当移动位数n等于0或者等于BOOL Y的特殊情况)╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
SAME: LAR1 LD 6 //数据区的起始地址(32位指针信息)
LAR2 P#0.0
L LW 2 //数据长度(BIT)
NEX3: T LW 100 //低位区移出的次数
L LW 4 //判断是不是DB块
L 0
>I
JCN DBX3
OPN DB [LW 4]
A [AR1,P#0.0]
= L 20.0
OPN #SAVE_TO_DB
A L 20.0
= DBX [AR2,P#0.0]
JU ADD3
DBX3: OPN #SAVE_TO_DB
A [AR1,P#0.0]
= DBX [AR2,P#0.0]
ADD3: +AR1 P#0.1
+AR2 P#0.1
L LW 100
LOOP NEX3
JU END
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
EROR: L 555
T #RET_VAL //程序错误返回错误代码555
CLR
SAVE
BE
END: L 0 //程序正确返回正确代码0
T #RET_VAL
SET
SAVE
BE
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬在OB1调用╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
L #OB1_PREV_CYCLE //CPU一个周期扫描的平均时间
CALL "ROTATE_LEFT_N_BIT"
SRCBLK :=P#DB11.DBX 0.0 BOOL 4000
ROTATE_NO :=2000
SAVE_TO_DB:=DB12
RET_VAL :=LW100