关于指针的应用?指向哪里?
刘玉蓉
发布于2014-11-07 17:36
192
0
标签:
LAR1 P##addr_1
AD DW#16#FFFFFF
L W#16#1002
T LW [AR1,P#0.0]
L 26
T LW [AR1,P#2.0]
L #WinACOldDB
T LW [AR1,P#4.0]
L DW#16#84000000
T LD [AR1,P#6.0]
这个功能块里面的一段程序,#addr_1是定义在TEMP中的ANY 类型变量,请问这个ANY类型是个什么类型?多少位 的?另外这段程序中的指针指向什么存储区域了?具体是哪个字节?,#addr_1由在什么存储区域,具体哪个字节?
问题补充:
现在还有句和第二句不明白,我是这样理解的,#addr_1本身是一个指针,句是把一个指向这个指针的指针放到LAR1中,
但是第二句是什么意思?为什么要做与操作?
佳答案
ANY是参数类型,当参数的类型不能确定或实参可使用任何数据类型时,可使用该参数,其占10个字节;
你的这段程序是利用寄存器AR1寻址,通过地址寄存器AR1对工作存储区中的临时本地数据存储器(L堆栈)内容进行寄存器间接寻址。地址寄存器AR1的内容加上偏移量形成指针(Pointer,指针是指向一个变量的地址,即用地址作为实参)。地址寄存器及其偏移量(如P#2.0)必须写在方括号内。寄存器间接寻址不改变地址寄存器的数值。用寄存器指针访问一个字节、字或双字时,必须保证地址指针中位地址编号为0。
所以这段程序中的指针指向本地数据存储器(又称本地数据寄存器),如LW[AR1,P#2.0]是指本地数据值:假设暂态变量#addr_1的值为26(指令LAR1 P##addr_1是将地址指针常数(暂态变量#addr_1)直接装载到地址寄存器AR1中)
AR1的值=26=2#0000 0000 0000 0000 0000 0000 1101 0 000
P#2.0=2#0000 0000 0000 0000 0000 0000 0001 0 000
所以AR1加偏移量P#2.0的结果:2#0000 0000 0000 0000 0000 0000 1110 0 000,把字节相加,后3位为位号相加LW28,所以程序执行的结果是累加器AR1加指针偏移量指明存储字为本地数据字LW28,将累加器1中的内容
所以#addr_1本身是将一个暂态变量作为一个指针,句是把一个指向这个指针的指针放到LAR1中
AD DW#16#FFFFFF // 将将累加器1中的内容与16#FFFFFF进行双字相”与“,由于FFFFFF每位都为”1“,结果不变,实际没有意义。