发布于 2011-12-02 10:36:46
61楼
寄存器间接寻址的优点
首先看一个例子:用ANY指针作为输入参数,用FC 2对若干个连续存放的字作异或运算。不是字则不进行运算。下面是FC 2中的STL程序:
L P##AnyPoint
LAR1 //10字节ANY指针的存放地址送AR1
L 0
T #Result
L B [AR1,P#1.0] //取ANY指针内的数据类型
L B#16#4
<>I
JC _003
L 0
L W [AR1,P#4.0] //取ANY指针内的数据块编号
==I
JC _001
T #DB_No
OPN DB [#DB_No]
_001: L W [AR1,P#2.0] //取ANY指针内的重复因子
T #Lenth
L D [AR1,P#6.0] //取ANY指针内数据区的起始地址
LAR1
L #Lenth
_002: T #Lenth
L W [AR1,P#0.0] //取要作异或运算的数据字
L #Result
XOW
T #Result
+AR1 P#2.0
L #Lenth
LOOP _002
_003: NOP 0
相对于存储器间接寻址,寄存器间接寻址有两大优点:
1.操作数中有两个可调的地址参数,即地址寄存器中的地址值和逗号后面的地址偏移量。
上面的程序开始的时候AR1存放的是10字节ANY指针中数据的起始地址。通过改变偏移量,可以方便地取出ANY指针中的数据类型B [AR1,P#1.0]、数据块编号[AR1,P#4.0]、数据的个数[AR1,P#2.0]和数据区D [AR1,P#6.0]的起始地址。如果改为存储器间接寻址,需要多次修改地址指针的值,才能取出不同的数据。
2.区域间的寄存器间接寻址包含了地址区的信息。
选用间接寻址方式的建议
有参数类型为Pointer和Any的输入参数的FC、FB,应选用寄存器间接寻址(见上例)。
某些情况(例如多重背景数据块)操作系统会使用AR2,某些情况需要保存和恢复AR1和AR2的值,因此地址寄存器的使用比较复杂,建议慎用。如果在使用地址寄存器间接寻址时,地址偏移量不变,例如一直为P#0.0,建议改为存储器间接寻址。
追求完美