首页 理论教育 存储器间接寻址初探

存储器间接寻址初探

时间:2023-06-17 理论教育 版权反馈
【摘要】:使用32位地址指针寻址参考下面的示例程序:使用32位地址指针寻址数据块地址时,数据块必须先打开,然后才能寻址,数据块寻址方法参考下面的示例程序,如果直接使用指令,则对完整数据格式地址进行间接寻址被视为非法。

存储器间接寻址初探

存储于存储器中的地址指针分为16位地址指针和32位地址指针,允许存储地址指针的存储器为M(标志位)、L(区域数据)及数据块(DB或DI),下面分别介绍两种地址指针的使用。

1.16位地址指针

16位地址指针用于定时器、计数器、程序块(DB、FC、FB)的寻址,16位指针被看作是一个无符号整数(取值范围0~65535),它指向定时器(T)、计数器(C)、数据块(DB、DI)或程序块(FB、FC)的号,16位指针的格式如下:

所有的定时器、计数器及程序块都可以使用间接寻址访问,访问时需要使用T、C、DB、DI、FB、FC等区域标识符,寻址的指针存储于一个16位的字中,地址寻址表示格式为:区域标识符[16位地址指针],例如打开一个DB表示为:

使用16位地址指针访问一个定时器和计数器的示例程序如下:

从上面的示例程序中,可以看出地址指针存储于MW20中,可以使用普通指令对MW20进行操作,MW20中存储数值的变化直接影响定器、计数器访问的地址。

数据块可以使用DB打开,也可以使用DI打开,如果地址指针为0,CPU不会报错,使用16位地址指针访问数据块的示例程序如下:

使用16位地址指针调用程序块(FB、FC)时,只能使用UC(无条件调用)或CC(有条件调用),而不能使用CALL指令,函数块中不能带有任何接口参数或静态变量,使用指针调用函数及函数块的示例程序如下:

FC12和FB13不能带有形参,这是由CC和UC调用指令决定的。

2.32位地址指针(www.xing528.com)

32位地址指针用于I、Q、M、L数据块等存储器中位、字节、字及双字的寻址,32位的地址指针可以使用一个双字表示,第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第31位没有定义,32位地址指针的格式如下:

访问时需要使用地址存储器标识符及32位地址指针,地址寻址表示格式为:地址存储器标识符[32位地址指针],例如指针存储于LD20中,装载M存储器一个字节表示为:

32位地址指针也可以使用常数表示,例如装载32位指针常数LP#40.3(P=指针,字节地址=40,位地址=3)。32位地址指针数据与双整数可以相互转换,由于指针指到一个位地址上,地址指针最小变化为一个位,相邻两个位的指针转换为双整数相差1,例如P#0.0转换双整数为L#0,P#0.1转换双整数为L#1,每一个字节地址加1,相应转换的整数值加8的倍数,例如P#2.0转换双整数为L#16,P#3.1转换双整数为L#25,在指针寻址时,可以使用指针的格式,也可以使用整数格式进行运算。使用32位地址指针寻址参考下面的示例程序:

使用32位地址指针寻址数据块地址时,数据块必须先打开,然后才能寻址,数据块寻址方法参考下面的示例程序,如果直接使用指令,则对完整数据格式地址(例如地址DB1.DBB[MD100])进行间接寻址被视为非法。

使用LOOP指令和32位地址指针可以进行循环操作,假设一个编程应用:一个字变量(MW2)与一个数组(假设存储于DB1中,包含100个元素为字的数组)存储的值相比较,如果数值相同,则指出第一个相同数值存储在DB中的位置(数组中的位置)。使用通常的编程方法,需要逐字进行比较,因而程序量比较大,如果实际需要与很多个数值比较,一个小型的CPU将无法完成控制任务,使用LOOP指令和地址指针相结合的方法,可以轻松地解决上述问题,参考下面的示例程序:

上述示例程序中编程量减少,但是程序执行时间并没有减少。32位地址指针指向一个位地址,在编程应用中注意P#1.0不等于整数1,否则CPU会因为无法处理而停机,参考下面错误的程序:

编程小技巧:

如果对字节进行操作,则指针转换为双整数最小变化率必须为8(指针为P#1.0)的倍数;如果对字进行操作,则指针转换为双整数值最小变化率必须为16(指针为P#2.0)的倍数;如果对双字、浮点变量进行操作,则指针转换为双整数值最小变化率必须为32(指针为P#4.0)的倍数,对指向字与双字的地址指针,这样的要求避免数据间的冲突,例如DBW[MD2],MD2为16的倍数时,按照DBW2、DBW4、DBW6寻址,如果为8的倍数,按照DBW1、DBW2、DBW3寻址,则造成数据冲突。

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

我要反馈