恭喜,你发布的帖子
发布于 2016-01-01 20:17:21
5楼
存储器间接寻址比较简单。
寄存器间接寻址比较复杂,功能更强,寻址的地址可用数据寄存器和偏移量来调节。
寄存器间接寻址最典型的应用是对参数类型POINTER或ANY中的参数的寻址。
请看下面的例子:用ANY指针作为输入参数,用FC 2对若干个连续存放的字作异或运算。不是字则不进行运算。
OB1调用FC 2时,将ANYPoint的实参保存在OB1的局部数据区(V区)中。
下面是FC 2中的程序,第一条指令的操作数P##ANYPoint是保存在V区的ANYPoint的10B实参的地址指针。其中的P#表示指针,第2个#号表示局部变量。
执行第一条LAR1指令以后,AR1中的程序状态监控值是参数ANYPoint的实参的起始地址V21.0。执行第二条LAR1指令以后,AR1中是要异或运算的数据区的地址指针值P#DBX0.0。
L P##ANYPoint //P#表示指针,第2个#号表示局部变量
LAR1 //ANYPoint的实参在V区的指针值送地址寄存器AR1
L 0
T #Result //将保存异或运算结果的字清0
L B [AR1,P#1.0] //取ANYPoint的实参内的数据类型
L B#16#4
<>I
JC _003 //不是字则返回
L 0
L W [AR1,P#4.0] //取ANYPoint的实参内的数据块编号
==I
JC _001 //不是数据块(编号为0)则跳转
T #DB_No //保存数据块编号
OPN DB [#DB_No] //打开ANYPoint的实参指定的数据块DB
_001: L W [AR1,P#2.0] //取ANYPoint的实参内的重复因子
T #Lenth //保存需要异或的字的个数
L D [AR1,P#6.0] //取ANYPoint的实参内要异或的数据区的指针值
LAR1 //要异或的数据的起始地址指针值P#DBX0.0送AR1
L #Lenth //取需要异或的字的个数(即需要循环的次数)
_002: T #Lenth //暂存循环计数器值
L W [AR1,P#0.0] //取数据字
L #Result //取异或运算的中间结果
XOW //字异或运算
T #Result //存放运算结果
+AR1 P#2.0 //地址指针值增加两个字节,指针指到下一个字
L #Lenth //循环计数器值装载到累加器1
LOOP _002 //若循环计数器值减1后非0,跳转到标号_002
_003: NOP 0
从上述例子可以看到寄存器间接寻址的优点,执行第二条LAR1指令之前,AR1中是POINTER或ANY的实参的地址指针值,通过修改寄存器间接寻址的地址偏移量,可以方便地读取ANY实参内的数据值或地址指针值。
请填写推广理由:
分享
只看
楼主