在以前的帖子中看到以下程序:
程序1.
TAR1 #tAR1_MEM //保存当前AR1到变量#tAR1_MEM
TAR2 #tAR_BASE //保存当前AR2到变量#tAR_BASE
L P##inDATA_POINTER //装载变量#inDATA_POINTER的起始地址到accu1
//在多重背景调用里,这个地址实际是相对地址,即就是一个偏移量
L DW#16#7FFFF
AD //过滤32位地址里的区域信息(比如P#DBX100.0变成P#100.0)
T #tAR_OFFSET //过滤后的变量#inDATA_POINTER的起始地址(偏移量)
L #tAR_OFFSET
L #tAR_BASE //这段代码我想是在FB里的 (FB里AR2保存的是背景数据的起始地址)
+D
LAR1 //这里实际就是把该变量的真实地址(即在多重背景数据块里的绝对地址)装载到AR1
L W [AR1,P#0.0]
T MW 2 //传送#inDATA_POINTER的第一个字到MW2,Pointer指针的第一个字是DB块号
L D [AR1,P#2.0]
T MD 4 //传送#inDATA_POINTER后4个字节的32位区域地址到MD4
LAR1 #tAR1_MEM //恢复AR1之前的值
程序2.
L P##CnvData
LAR1
TAR2
+AR1
前面这几句,有大侠认为等同以下几句:
TAR2
AD DW#00FFFFFF
+D
LAR1
以上2个程序可以看出:最终得到AR1地址的方法是不同的:程序1= 变量的地址过滤后+AR2地址;而程序2=变量地址+AR2过滤后地址。 究竟这FB中变量的最终地址AR1该是按哪种方法呢(我偏向程序2的方法)
另:程序2中后面的那几句(也就是等同一下几句下面),感觉不是很必要。因为我查看了一下"+AR1"这条指令的说明:
+AR1 (add to AR1) adds an offset specified either in the statement or in ACCU 1-L to the contents of AR1. The integer (16 bit) is initially expanded to 24 bits with its correct sign and then added to the least significant 24 bits of AR1 (part of the relative address in AR1). The part of the area ID in AR1 (bits 24, 25, and 26) remains unchanged. The instruction is executed without regard to, and without affecting, the status bits.
大概意思:accu1中的16位会先扩为24位,再加到ar1的32位地址值中组成新的ar1的32位地址值。这就不用担心AR中的19位地址值会漏掉3位的问题。
大概就是如此,不知我表达清楚没有?(这两程序计算FB中变量的方法不同,哪个正确呢)