首页 理论教育 寄存器间接寻址优化技巧分享

寄存器间接寻址优化技巧分享

时间:2023-06-17 理论教育 版权反馈
【摘要】:与存储器间接寻址不同,寄存器间接寻址使用CPU内部集成的两个32位地址寄存器AR1、AR2存储地址指针。使用地址寄存器指令可以对AR1、AR2地址寄存器进行操作,指令如下所示:寄存器间接寻址分为32位内部区域指针和32位交叉区域指针。

寄存器间接寻址优化技巧分享

存储器间接寻址不同,寄存器间接寻址使用CPU内部集成的两个32位地址寄存器AR1、AR2存储地址指针。使用地址寄存器指令可以对AR1、AR2地址寄存器进行操作,指令如下所示:

978-7-111-28718-6-Chapter08-15.jpg

寄存器间接寻址分为32位内部区域指针和32位交叉区域指针。

1.32位内部区域指针

32位内部区域指针用于I、Q、M、L数据块等存储器中位、字节、字及双字的寻址,与32位存储器指针的使用相同,不同之处在于指针存储的位置不同。32位内部区域地址指针的格式如下:

978-7-111-28718-6-Chapter08-16.jpg

第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第30位没有定义,第31位为内部区域与交叉区域指针标识,0表示内部区域指针,1表示交叉区域指针。

32位内部区域指针地址寻址表示格式为:地址存储器标识符[地址寄存器,地址偏移常量],例如装载M存储器一个字节表示为:

978-7-111-28718-6-Chapter08-17.jpg

指针指向地址=地址寄存器存储地址+地址偏移常量,如果AR1装载的地址为P#8.0,实际装载的地址为MB18。32位内部区域指针的使用方法参考下面的示例程序:

978-7-111-28718-6-Chapter08-18.jpg

2.32位交叉区域指针

32位交叉区域指针与32位内部指针相比,地址指针中带有存储区域标识符,如I、Q、M等,32位交叉区域地址指针的格式如下:

978-7-111-28718-6-Chapter08-19.jpg

第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第24位~第26位为地址标识符,表示的地址区域如下:

000表示没有地址区,例如P#12.0;

001表示输入地址区I,例如P#I12.0;

010表示输出地址区Q,例如P#Q12.0;

011表示标志位地址区M,例如P#M12.0;

100表示数据块(DB)中的数据,例如P#DB1.DBX12.0;

101表示数据块(DI)中的数据,例如P#DI1.DIX12.0;

110表示区域地址区L,例如P#L12.0;

111表示调用程序块的区域地址区V,例如P#V12.0。

第31位为内部区域与交叉区域指针标识,0表示内部区域指针,1表示交叉区域指针。使用交叉区域指针的表示方法(例如装载M存储器一个字节)为:

978-7-111-28718-6-Chapter08-20.jpg(www.xing528.com)

978-7-111-28718-6-Chapter08-21.jpg

指针指向地址=地址寄存器存储地址+地址偏移常量,上例中实际装载的地址为MB30。如果访问一个位信号,则没有访问宽度。32位交叉区域指针的使用方法参考下面的示例程序:

978-7-111-28718-6-Chapter08-22.jpg

3.地址寄存器AR1、AR2的监控

存储于存储器的地址指针可以直接通过变量监控表监控,存储于AR1、AR2中的地址指针则需要使用STL程序“Monitor”进行监控,监控之前必须在程序块中的菜单进行设置,点击菜单“Options”→“Customize”→“STL”界面中,选择“Address Register1”和“Address Register2”选项,在程序监控中可以显示AR1、AR2的内容,如图8-2所示。

978-7-111-28718-6-Chapter08-23.jpg

图8-2 监控AR1、AR2

4.地址寄存器AR1、AR2的限制

存储区间接寻址和寄存器间接寻址具有相同的功能,在一些特殊条件下,使用地址寄存器AR1、AR2会有下列的限制:

1)在形参的传递中,STEP7使用地址寄存器AR1访问函数(FC)接口及函数块(FB)“INOUT”接口中定义的复合类型参数,如ARRAY、STRUCT、DATE_AND_TIME等,AR1和DB寄存器中的内容将被覆盖,例如在FC1中“IN”接口中定义一个数组变量,在OB1中调用,使用OB1的L区域数据进行赋值,调用关系如图8-3所示。

如果在FC1中访问数组变量的元素,如ARR_TEST[1],地址寄存器AR1及DB寄存器会发生变化,示例程序如图8-4所示。

978-7-111-28718-6-Chapter08-24.jpg

图8-3 调用关系

978-7-111-28718-6-Chapter08-25.jpg

图8-4 访问FC中复合数据类型数据

图8-4示例程序中前两条语句中打开DB1,并将P#20.0装载到AR1中,在第三条语句访问数组的一个元素后,AR1存储的地址指针变为P#V20.0(指向OB1中实参ARR_TEST的地址,参考图8-3),DB寄存器中存储的值为0,程序下传到CPU后将出现故障报警。将程序的执行次序进行修改,CPU即可运行,修改后的程序如下:

978-7-111-28718-6-Chapter08-26.jpg

执行次序修改后可能会造成不必要的错误,访问复合变量时建议使用存储区间接寻址。访问FC、FB区域变量L,不会覆盖AR1、DB寄存器。

2)AR2和DI寄存器分别包含FB背景数据块的块号及在背景数据中偏移地址(多重背景数据块),在FB中,使用AR2和DI寄存器将会覆盖系统存储的内容。如果必须在FB中使用AR2和DI寄存器,建议使用下面的方法处理AR2和DI寄存器,首先保存AR2和DI寄存器中的数据,程序如下:

978-7-111-28718-6-Chapter08-27.jpg

然后编写用户程序,可以对AR2和DI寄存器进行操作,但是在程序中不能访问FB参数或静态变量。使用完成后恢复AR2和DI寄存器的系统值,程序如下:

978-7-111-28718-6-Chapter08-28.jpg

3)P#<地址>可以直接指向布尔型变量,例如P#M20.0、P#DBX12.0等,也可以指向程序块中接口参数区、区域数据区L及静态变量,例如P##PARA(参数)指向PARA参数的开始地址。将指向函数FC的IN、OUT、INOUT类型参数的指针装载到地址寄存器中不可以直接操作,例如:

978-7-111-28718-6-Chapter08-29.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈