quote:以下是引用*在2014-12-23 16:15:19的发言:
感谢楼主letham为大家做的分享和精彩讲解,但我觉得其中有点小错误:
------“当我们在程序里进行调用FB块时,AR2寄存器类容被初始化为16#85000000.实际上在该FB期间AR2一直保持为16#85000000,当该FB块为一个“父FB块”时,在调用到“子FB块”时,AR2类容变为什么了?答案是在调用"子FB块"过程中AR2类容变为16#85000000+"子FB块"在“父FB块”中的偏移地址”-------其中的AR2内容应为“16#84000000”或“16#84000000+"子FB块"”。
那么在程序中怎么能正确获得背景数据的地址呢?那是因为CPU先执行了“LAR1 P##Bins”,此后的“+AR1 ”并不影响区域ID.再说下面程序再使用变址寻址时又是区域内寻址。所以程序能如愿执行。
对 是有点笔误,AR2内容为16#8500开始的,FB块内调用多重背景后,AR2内容会变成多重背景在FB背景DB块的偏移地址,比如P#DIX200.0,在多重背景调用结束后AR2内容会自动回到P#DIX0.0
这个过程是由CPU操作系统来做的。
但是你的理解有误,我不是想要说明是指针的存储区域的改变与否,在我的程序中AR1,AR2内容始终是P#DIX x.y。
LAR1 P##Bins;
这个语句 仅仅得到的是BINS在被多重背景调用的FB块中的首地址,但是多重背景FB没有自己的DB块,它正确执行,需要调用多重背景的FB块的背景DB块,但是多重背景FB的偏移地址很可能 不是从0开始的,所以为了 正确定位到 多重背景FB所使用的数据区,必须 加上AR2的内容,才能正确对应到DB块的数值,这就是TAR2,后+AR1目的所在,没有这2句,FB块直接调用 不会有任何问题!但以多重背景方式调用,就不会正确执行了!
所以 整个程序讨论的重点 和32位指针的区域ID 是否改变没有任何关系。
我可以
T W[AR1,P#0.0]
来做 ,它也不会出错。