quote:以下是引用LJCLWYF在2015-01-06 16:30:52的发言:
回letham老师:我监控过背景db,正如你说的情况。但是我不知道为什么不能将#b的address的db1.dbw8的起始地址读不到ar1里?监控#b(没有加ar2)时的情况如下:
程序 ar1 ar2
l p#address db8.0 db14.0
lar1 di2.0 ..(同上)
l w[ar1,p#0.0] .. ..
t db_no .. ..
l d[ar1,p#2.0] .. ..
lar1 db0.0 ..//这里为什么是db0.0,而不是我输入的db8.0
opn db[db_no] db0.0 db14.0
l 4 .. ..
c1:t temp2 db6.0 ..//这里为什么是db6.0
后面ar1和ar2的值就分别是db6.0和db14.0,而且监控#a时除了ar2的值变成了db0.0以外,ar1的值和#b是一样的。
而且这时的执行结果就是我7楼说的结果。
我把fb1的address改成双字,然后l p#0.0; t md100
l p#8.0; t md104
把md100给#a的address,
把md104给#b的address,不加ar2,结果正确。是什么原因必须要按照PKH2006老师的做法才对呢?
首先,你需要知道 POINTER类型是一个指向指针的指针,它不是直接的32位指针。
实参到形参的传递是要用到调用者的参数区,你的程序里,就是DI。
在对POINTER进行使用前,必须对POINTER进行分析。
你 这样编写 也是没有问题的,建议你 监控下DB1和DB2寄存器内容,
同时看看 你的背景DB块的 DBW2和DBD4 的数值 是不是1和DW#16#84000040。
具体问题,你还需自己检查下,是不是后面还有类似的背景FB的调用 覆盖了AR1的内容。